[mysql] select op meerdere rijen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Anoniem: 331027

Topicstarter
Ik heb de volgende table in MySQL:
code:
1
2
3
4
5
6
product_property_id product_id  property_id
1                       1           2
2                       1           6
3                       1           9
4                       2           3
5                       2           6

Hoe kan ik nu de product_id's met een SELECT ophalen die een property_id van 2 heeft én een property_id van 9.

Ik wat geprobeerd met LEFT JOIN en subqueries, maar dat loopt altijd mis omdat er een select moet gebeuren op verschillende rijen.

Heeft iemand een idee hoe ik dat met Mysql kan oplossen? Of moet ik het via PHP doen?

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online

Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
Hint: kijk/zoek eens naar de IN clausule.

Acties:
  • 0 Henk 'm!

  • semitweakert
  • Registratie: Februari 2012
  • Nu online
Razr schreef op donderdag 01 november 2012 @ 23:09:
Hint: kijk/zoek eens naar de IN clausule.
De IN clausule is toch meer ter vervanging van (meerdere) OR clausules? Ik zelf dacht meer in de richting van een INTERSECT of EXISTS..

edit: Ik zie net dat t om mysql gaat en die INTERSECT zal dus moeten worden herschreven (naar bijv. een INNER JOIN waarbij je met verschillende 'namen' naar dezelfde tabel refereert)

[ Voor 24% gewijzigd door semitweakert op 01-11-2012 23:17 ]


Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
semitweakert schreef op donderdag 01 november 2012 @ 23:13:
[...]


De IN clausule is toch meer ter vervanging van (meerdere) OR clausules? Ik zelf dacht meer in de richting van een INTERSECT of EXISTS..
Je hebt gelijk, ik las verkeerd (ik dacht of i.p.v. en). Het zou trouwens wel kunnen met IN, je doet dan een IN (2,9) en dan een GROUP BY op je product id, als de COUNT van het aantal regels in je groep dan matchen met het aantal waarden in je IN clausule kun je dat product id selecteren.

In T-SQL zou het zoiets worden (mag je zelf de vertaalslag naar MySQL doen :+ ):
SQL:
1
2
3
SELECT F.product_id FROM FOOTABLE F
WHERE F.property_id IN (2,9)
GROUP BY F.product_id HAVING COUNT(DISTINCT F.property_id) = 2

[ Voor 16% gewijzigd door Razr op 01-11-2012 23:43 ]


Acties:
  • 0 Henk 'm!

  • Dadona
  • Registratie: September 2007
  • Laatst online: 05-07 23:03
SQL:
1
2
3
SELECT product_id FROM testje WHERE property_id=2 AND product_id IN (
    SELECT product_id FROM testje WHERE property_id=9
)

[ Voor 6% gewijzigd door Dadona op 01-11-2012 23:38 . Reden: Syntax en even 2 en 9 omgedraaid, in jouw voorbeeld zal de subquery nog twee rijen weergeven. Andersom is het feest al in de subquery ten einde. :P ]

De CSL/OT kroeg !


Acties:
  • 0 Henk 'm!

  • Bu588
  • Registratie: Maart 2000
  • Laatst online: 24-04 21:09
SQL:
1
2
3
4
5
6
SELECT a.product_id
FROM testje a
INNER JOIN testje b
WHERE a.product_id = b.product_id
AND a.property_id = 2
AND b.property_id = 9

[ Voor 46% gewijzigd door Bu588 op 02-11-2012 13:44 . Reden: Beter lezen :-( ]

Nothing is fool-proof to a sufficiently talented fool...


Acties:
  • 0 Henk 'm!

  • Razr
  • Registratie: September 2005
  • Niet online
@Dadona en @Bu588, wat als hij nu de product_id's wil hebben voor de producten niet alleen met property_id 2 en 9, maar met veel meer getallen/id's? Dan worden jullie voorbeelden aanzienlijk langer.

Acties:
  • 0 Henk 'm!

  • Dadona
  • Registratie: September 2007
  • Laatst online: 05-07 23:03
Vrij recent was er ook een MySQL topic en had menigeen het erover dat performance leuk en aardig is, maar dat je soms gewoon voor de snelle optie moet gaan. Mocht het te langzaam zijn of te lang worden dan kan het vast mooier, maar laat de TS eerst maar eens aangeven of dit echt een issue is.
Daarnaast is het natuurlijk niet echt aantrekkelijk om veel tijd te steken in optimalisatie als de user een username als toedeloe1 heeft, dergelijke historie heeft en zich nog niet in het topic heeft terug laten zien. :P

De CSL/OT kroeg !

Pagina: 1