Mysql
 sql >> Base de données >  >> RDS >> Mysql

Les résultats de la jointure MYSQL définissent les résultats effacés pendant IN () dans la clause where ?

Réfléchissez à ce que votre code fait logiquement :

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

est équivalent à

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

Il n'y a aucun moyen tag.tag_id peut satisfaire les deux conditions en même temps, donc le ET n'est jamais vrai.

Il semble que la version OR que vous avez citée dans votre question soit celle que vous voulez vraiment :

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

En utilisant la clause IN de manière plus appropriée, vous pouvez écrire cela comme :

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

Une dernière remarque, car vous faites référence à une colonne de la table LEFT JOINed dans votre clause WHERE (tag.tag_id ), vous forcez vraiment cela à se comporter comme un INNER JOIN. Pour vraiment obtenir un LEFT JOIN, vous devez déplacer les critères hors de WHERE et les intégrer aux conditions JOIN à la place :

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