[MySQL] Alternatief voor EXISTS

Pagina: 1
Acties:

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Hoi, ik zit met een probleempje. Ik heb een tabel a en een tabel b. Ik wil nu het volgende (versimpeld):
SQL:
1
2
3
4
SELECT * FROM a 
WHERE 
  a.parent_id = 7 AND 
  EXISTS (SELECT * FROM b WHERE b.area_id = a.area_id)

Nu moet ik helaas MySQL gebruiken, en nog mooier:
code:
1
mysql  Ver 12.22 Distrib 4.0.24, for pc-linux-gnu (i686

EXISTS wordt dus niet ondersteund. Nu dacht ik het op te lossen met iets als dit:
SQL:
1
2
3
4
SELECT * FROM a 
LEFT JOIN b ON b.area_id = a.area_id
WHERE a.parent_id = 7
GROUP BY a.area_id

Ik kom er wel uit, maar erg snel is het niet. Weet iemand een betere/snellere manier om dit op te lossen?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Die eerste variant is vziw ook niet bepaald snel in MySQL (vergeleken met bijv postgresql)... Dus ik geef je weinig kans om een snellere variant te vinden in een (nog) beperktere versie van mysql :)

Zorg natuurlijk sowieso voor een index op a.parent_id en b.area_id. Trouwens jouw variant is niet equivalent want je krijgt alle a's met parent_id 7, ook die zonder b's. Je wilt een gewone inner JOIN, gok ik zo.

  • jochemd
  • Registratie: November 2000
  • Laatst online: 29-12-2025
chris schreef op zaterdag 30 juli 2005 @ 15:30:
SQL:
1
2
3
4
5
6
7
8
9
SELECT * FROM a 
WHERE 
  a.parent_id = 7 AND 
  EXISTS (SELECT * FROM b WHERE b.area_id = a.area_id)

SELECT * FROM a 
LEFT JOIN b ON b.area_id = a.area_id
WHERE a.parent_id = 7
GROUP BY a.area_id
Tenzij je ons een heleboel niet verteld over het schema zijn deze queries niet het zelfde. Je eerste query geeft één row van a voor elke row van a waar parent_id 7 is en de area_id voorkomt in tabel b. Je tweede query geeft elke row van a waarvoor parent_id 7 is, ongeacht of de area_id voorkomt in tabel b. Daarnaast geeft je tweede query ook de velden van b in de resultset en gaat de wijze waarop je een group by doet dus expliciet tegen de aanwijzingen uit de mysql handleiding in:
Do not use this feature if the columns you omit from the GROUP BY part are not unique in the group! You get unpredictable results.
Het nette antwoord op je vraag is:
SQL:
1
2
3
4
SELECT a.* FROM a 
INNER JOIN b ON b.area_id = a.area_id
WHERE a.parent_id = 7
GROUP BY a.area_id, a.parent_id, alle, ander, kolommen, van, a

Deze is waarschijnlijk een stukje sneller door het verschil tussen een LEFT en een INNER join. Als je nog steeds een significant snelheidsverschil ziet laat dan de EXPLAIN output van beide queries maar zien.

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Het ging me inderdaad om het idee, ik had nog niet uitgezocht welke JOIN-variant ik moest gebruiken. Maar met een INNER JOIN moet het lukken dus. Nou ja, ik ga er mee aan de gang.