sql >> Databáze >  >> RDS >> Mysql

MySQL:Hledání řádků, které se neúčastní vztahu

Zde je typický způsob, jak provést tento dotaz bez použití metody poddotazu, kterou jste ukázali. To může uspokojit požadavek @Godeke na zobrazení řešení založeného na spojení.

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;

U většiny značek databází však toto řešení může fungovat hůře než řešení poddotazů. K analýze obou dotazů je nejlepší použít EXPLAIN, abyste viděli, který bude fungovat lépe vzhledem k vašemu schématu a datům.

Zde je další varianta řešení poddotazu:

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

Toto je korelovaný poddotaz, který musí být vyhodnocen pro každý řádek vnějšího dotazu. Obvykle je to drahé a váš původní příklad dotazu je lepší. Na druhou stranu v MySQL "NOT EXISTS " je často lepší než "column NOT IN (...) "

Opět musíte vyzkoušet každé řešení a porovnat výsledky, abyste si byli jisti. Výběr jakéhokoli řešení bez měření výkonu je ztráta času.



  1. COALESCE v laravel

  2. Objednejte podle posledních 3 znaků

  3. Spusťte dotaz MySQL na vzdáleném počítači přes ssh v příkazovém řádku

  4. Jak odstranit řadu záznamů najednou na MySQL?