[DBI:MySQL] nested queries

Pagina: 1
Acties:

  • bRight
  • Registratie: Juli 2000
  • Laatst online: 27-11-2024

bRight

digitaal

Topicstarter
Ik heb de volgende 2 tabellen in MySQL:

toegang:
code:
1
2
3
4
5
6
7
8
9
+------------+-----------+
| bedrijf_id | inkoop_id |
+------------+-----------+
| 1          | 1         |
| 1          | 2         |
| 1          | 3         |
| 2          | 1         |
| 2          | 4         |
+------------+-----------+


categorie:
code:
1
2
3
4
5
6
7
8
+-----------+------------+
| inkoop_id | naam       |
+-----------+------------+
| 1         | potloden   |
| 2         | pennen     |
| 3         | gummetjes  |
| 4         | paperclips |
+-----------+------------+


De 1e tabel geeft aan in welke inkoopcategorien een bedrijf mag inkopen, en de 2e hoe die categorien heten.

Nu wil ik een lijst opvragen van inkoopcategorien waarvoor bedrijf met bedrijf_id 2 toegang heeft:

code:
1
2
3
4
5
6
+-----------+------------+
| inkoop_id | naam       |
+-----------+------------+
| 4         | paperclips |
| 1         | potloden   |
+-----------+------------+


Volgens mij zou dat met een subquery op de volgende manier moeten kunnen:
Perl:
1
2
$sth = $dbh->prepare('SELECT * FROM categorie WHERE inkoop_id = (SELECT inkoop_id from toegang WHERE bedrijf_id = ?) ORDER BY naam');
$sth->execute("2");


maar ik krijg een foutmelding "Not a SCALAR reference". Wat doe ik verkeerd?

[ Voor 3% gewijzigd door bRight op 17-06-2003 18:06 . Reden: typo ]


Verwijderd

http://www.mysql.com/doc/en/ANSI_diff_Sub-selects.html

sub selecties in MySQL vanaf versie 4.1

Dus wat je doet kan nog niet!

of


SELECT categorie.* FROM categorie LEFT JOIN toegang WHERE categorie.inkoop_id = toegang_inkoop_id AND toegang.bedrijf_id = 'X'

[ Voor 35% gewijzigd door Verwijderd op 17-06-2003 18:30 ]


  • bRight
  • Registratie: Juli 2000
  • Laatst online: 27-11-2024

bRight

digitaal

Topicstarter
tnx!

Ik had hem zelf al omgeschreven naar
SELECT categorie.* FROM categorie, toegang WHERE categorie.inkoop_id = toegang.inkoop_id AND toegang.bedrijf_id = 'X'

Maar met een join kan inderdaad ook :)

[ Voor 5% gewijzigd door bRight op 17-06-2003 18:43 ]


  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

AArsgier schreef op 17 June 2003 @ 18:41:
tnx!

Ik had hem zelf al omgeschreven naar
SELECT categorie.* FROM categorie, toegang WHERE categorie.inkoop_id = toegang.inkoop_id AND toegang.bedrijf_id = 'X'

Maar met een join kan inderdaad ook :)
Mag ik even mierenneuken? :P

Dat is ook een join, alleen dan een inner join, en daardoor valt het wat minder op dat het een join is.

Rustacean


Verwijderd

Volgens mij is de statement die je gebruikt hebt goed, althans bijna goed. Het enige wat je moet veranderen is het '=' karakter. Dit moet 'IN' zijn. De statement die je dus ook zou kunnen gebruiken is: 'SELECT * FROM categorie WHERE inkoop_id IN (SELECT inkoop_id from toegang WHERE bedrijf_id = ?) ORDER BY naam'
Als je het '=' karakter gebruikt moet het resultaat van de sub-selectie één enkele waarde zijn. Bijvoorbeeld 'select count(*) from...' Met de 'IN' statement hoeft dit niet.