Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL:Znajdowanie wierszy, które nie biorą udziału w relacji

Oto typowy sposób wykonania tego zapytania bez użycia pokazanej metody podzapytania. Może to spełnić prośbę @Godeke, aby zobaczyć rozwiązanie oparte na dołączaniu.

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;

Jednak w większości marek baz danych to rozwiązanie może działać gorzej niż rozwiązanie podzapytania. Najlepiej użyć EXPLAIN do analizy obu zapytań, aby zobaczyć, które z nich będzie lepiej działać, biorąc pod uwagę Twój schemat i dane.

Oto kolejna odmiana rozwiązania podzapytania:

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

Jest to skorelowane podzapytanie, które musi zostać ocenione dla każdego wiersza zapytania zewnętrznego. Zwykle jest to kosztowne, a Twoje oryginalne przykładowe zapytanie jest lepsze. Z drugiej strony w MySQL „NOT EXISTS " jest często lepsze niż "column NOT IN (...)

Ponownie musisz przetestować każde rozwiązanie i porównać wyniki, aby mieć pewność. Wybieranie dowolnego rozwiązania bez mierzenia wydajności to strata czasu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najbliższe lokalizacje z szerokością i długością geograficzną

  2. MySQL Z klauzulą

  3. Scalić 2 tabele dla zapytania SELECT?

  4. Jaka jest różnica między INNER JOIN, LEFT JOIN, RIGHT JOIN i FULL JOIN?

  5. Mysql - Jak wyszukiwać z rozróżnianiem wielkości liter?