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

Výsledky spojení MYSQL set vymazané výsledky během IN () v klauzuli where?

Přemýšlejte o tom, co váš kód logicky dělá:

( 1 IN (tag.tag_id) ) AND ( 2 IN (tag.tag_id) )

je ekvivalentní k

( 1 = (tag.tag_id) ) AND (2 = (tag.tag_id) )

Neexistuje žádný způsob, jak tag.tag_id může splňovat obě podmínky současně, takže AND není nikdy pravdivé.

Vypadá to, že verze OR, kterou jste uvedli ve své otázce, je ta, kterou opravdu chcete:

SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id 
  WHERE ( ( 1 IN (tag.tag_id) ) OR ( 2 IN (tag.tag_id) ) );   

Vhodnějším použitím klauzule IN byste to mohli napsat jako:

SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id 
  WHERE tag.tag_id in (1,2);   

Jedna poznámka na závěr, protože odkazujete na sloupec z tabulky LEFT JOINed v klauzuli WHERE (tag.tag_id ), opravdu to nutíte, aby se chovali jako INNER JOIN. Abyste skutečně získali LEFT JOIN, museli byste přesunout kritéria z WHERE a začlenit je do podmínek JOIN:

SELECT DISTINCT name FROM person LEFT JOIN tag ON person.id = tag.person_id 
  AND tag.tag_id in (1,2);   


  1. Najděte uživatele v Laravel podle uživatelského jména

  2. duplicitní klíč postgresql porušuje jedinečné omezení

  3. SQL Server:Rozdíl mezi PARTITION BY a GROUP BY

  4. Ladění výkonu celého plánu dotazů