sql >> Database >  >> RDS >> Mysql

MYSQL-joinresultaten stellen gewiste resultaten in tijdens IN () in waar-clausule?

Denk na over wat uw code logisch doet:

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

is gelijk aan

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

Er is geen manier tag.tag_id kan tegelijkertijd aan beide voorwaarden voldoen, dus de AND is nooit waar.

Het lijkt erop dat de OR-versie die u in uw vraag noemde, de versie is die u echt wilt:

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) ) );   

Als u de IN-clausule beter gebruikt, zou u dat kunnen schrijven als:

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

Een laatste opmerking, omdat je verwijst naar een kolom uit de LEFT JOINed-tabel in je WHERE-clausule (tag.tag_id ), je dwingt dat echt om je te gedragen als een INNER JOIN. Om echt een LEFT JOIN te krijgen, moet je de criteria uit de WHERE halen en in plaats daarvan onderdeel maken van de JOIN-voorwaarden:

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


  1. SQLite Python

  2. Installeer en maak verbinding met PostgreSQL 10 op Ubuntu 16.04

  3. Ruby on Rails-migratie, twee primaire sleutels maar slechts één automatisch verhoogd

  4. MySQL op verwijder cascade. Testvoorbeeld