[mysql] items welke ID in meerdere records voorkomt *

Pagina: 1
Acties:

  • Guillome
  • Registratie: Januari 2001
  • Niet online
Haai
Ik heb 2 tabellen:
ria_photos (informatie over fotos)
ria_photo_cat (linken aan een categorie)
- photo_id
- category_id

Als ik nu alle fotos wil hebben die bij category_id 1 OF 5 horen doe ik dit:
code:
1
2
3
4
5
6
SELECT 
 DISTINCT p.* 
FROM 
 ria_photo_cat pc, ria_photos p 
WHERE 
 pc.photo_id = p.photo_id AND ( pc.category_id = 1 OR pc.category_id = 5)

Dit gaat goed.

Maar nu wil ik alle fotos die bij category_id 1 EN 5 horen. Hoe moet dat?
Ik zit al uren te kloten maar kom er niet uit.
Dit werkt iig niet
code:
1
2
3
4
5
6
SELECT 
 DISTINCT p.* 
FROM 
 ria_photo_cat pc, ria_photos p 
WHERE 
 pc.photo_id = p.photo_id AND ( pc.category_id = 1 AND pc.category_id = 5)


Alvast bedankt!!

[ Voor 4% gewijzigd door Guillome op 15-10-2004 22:49 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Sorry, dit kan helaas niet handig met MySQL. Je zult het in je applicatie of met meerdere queries en een temporary table moeten oplossen.

[ Voor 52% gewijzigd door Soultaker op 15-10-2004 22:54 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:50

gorgi_19

Kruimeltjes zijn weer op :9

Soultaker schreef op 15 oktober 2004 @ 22:53:
Sorry, dit kan helaas niet handig met MySQL.
Je zou misschien eens met een COUNT aan de slag kunnen en dan kijken waar de COUNT 2 is; je groepeerd dan op p.photo_id en zet pc.category_id in je WHERE -statement.

Afhankelijk van de MySQL kan je deze dan in een subquery stoppen.

Topictitle trouwens ook gedaan; "query" zegt weinig over je probleem.

[ Voor 20% gewijzigd door gorgi_19 op 15-10-2004 22:56 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Ah ja, MySQL 4.1 schijnt wel subqueries te doen. Dan kun je het zo oplossen:
SQL:
1
SELECT * FROM x WHERE x.cat = 1 AND x.id IN (SELECT id FROM x WHERE x.cat = 5)


Maar ja, dat blijft toch een stuk minder mooi dan de code die je in de meeste DBMS'en kunt gebruiken:
SQL:
1
2
3
SELECT * FROM x WHERE x.cat = 1
INTERSECT
SELECT * FROM x WHERE x.cat = 5

  • Guillome
  • Registratie: Januari 2001
  • Niet online
Hmm Soultaker: ik gaf maar een voorbeeld met 1 en 5. Je moet ook meerdere categorieën kunnen aangeven

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:50

gorgi_19

Kruimeltjes zijn weer op :9

XLerator schreef op 15 oktober 2004 @ 23:01:
Hmm Soultaker: ik gaf maar een voorbeeld met 1 en 5. Je moet ook meerdere categorieën kunnen aangeven
Je kan die code van Soultaker toch eenvoudig aanpassen? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Guillome
  • Registratie: Januari 2001
  • Niet online
nouja mysql kent geen intersect en over die subquery:
code:
1
2
3
4
5
6
7
8
SELECT 
  * 
FROM 
  ria_photo_cat pc 
WHERE 
  pc.category_id = 1 
 AND 
  pc.category_id IN (SELECT category_id FROM ria_photo_cat pc WHERE pc.category_id = 5)

Zo? Doet ie niet :)


edit
hmm zo kan ik in php er wel uitkomen. Bedankt voor de opzet!
code:
1
2
3
4
5
6
7
SELECT 
 DISTINCT p.*, 
 COUNT(pc.category_id) 
FROM 
 ria_photo_cat pc, ria_photos p 
WHERE 
 pc.photo_id = p.photo_id AND pc.category_id IN (1,5) GROUP BY pc.photo_id

[ Voor 56% gewijzigd door Guillome op 15-10-2004 23:18 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Ah, die count-methode is wel wat lomp, maar kan wel werken. Je hebt daar eigenlijk ook geen PHP meer bij nodig, als je de relevante resultaten uitfiltert met een HAVING-clause:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT 
  DISTINCT p.*
FROM 
  ria_photo_cat pc,
  ria_photos p 
WHERE 
  pc.photo_id = p.photo_id AND
  pc.category_id IN (1,5,7,13)
GROUP BY
  pc.photo_id
HAVING
  COUNT(pc.category_id) = 4

De 4 in de HAVING-clause komt overeen met het aantal elementen in de WHERE-clause. Het idee is dat je alle gevonden rijen groepeert op photo_id, en alleen de groepen waarin alle categorien vertegenwoordigd zijn, worden opgeleverd.

  • djantje
  • Registratie: Januari 2000
  • Laatst online: 29-11-2025
XLerator schreef op 15 oktober 2004 @ 23:04:
nouja mysql kent geen intersect en over die subquery:
Mysql kent UNION, daarmee kun je query's combineren in een resultset, lees ik op
http://dev.mysql.com/doc/mysql/en/UNION.html

[ Voor 3% gewijzigd door djantje op 16-10-2004 18:21 ]


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Maar een union (vereniging) is een hele andere operatie dan intersection (doorsnede). Je kunt met alleen vereniging geen doorsnede berekenen, of vice versa.
Pagina: 1