sql >> Databasteknik >  >> RDS >> Mysql

MySQL:Hitta rader som inte deltar i ett förhållande

Här är ett typiskt sätt att göra den här frågan utan att använda subquery-metoden du visade. Detta kan tillfredsställa @Godekes begäran att se en anslutningsbaserad lösning.

SELECT * 
FROM movies m
 LEFT OUTER JOIN seen s
 ON (m.id = s.movie_id AND s.user_id = 123)
WHERE s.movie_id IS NULL;

Men i de flesta märken av databas kan denna lösning prestera sämre än lösningen för underfrågan. Det är bäst att använda EXPLAIN för att analysera båda frågorna, för att se vilken som är bättre med tanke på ditt schema och din data.

Här är en annan variant av subquery-lösningen:

SELECT * 
FROM movies m
WHERE NOT EXISTS (SELECT * FROM seen s 
                  WHERE s.movie_id = m.id 
                    AND s.user_id=123);

Detta är en korrelerad underfråga, som måste utvärderas för varje rad i den yttre frågan. Vanligtvis är detta dyrt, och din ursprungliga exempelfråga är bättre. Å andra sidan, i MySQL "NOT EXISTS " är ofta bättre än "column NOT IN (...) "

Återigen måste du testa varje lösning och jämföra resultaten för att vara säker. Det är ett slöseri med tid att välja vilken lösning som helst utan att mäta prestanda.



  1. Ska jag ange både INDEX och UNIKT INDEX?

  2. MySQL fulltextsökning efter ord med tre eller färre bokstäver

  3. Infoga INTO MySQL FRÅN en annan tabell

  4. Lagrar Oracle efterföljande nollor för nummerdatatyp?