sql >> Databasteknik >  >> RDS >> Mysql

MYSQL join results set raderade resultat under IN () i var klausul?

Tänk på vad din kod gör logiskt:

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

motsvarar

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

Det går inte att tag.tag_id kan uppfylla båda villkoren samtidigt, så OCH är aldrig sant.

Det ser ut som att OR-versionen du citerade i din fråga är den du verkligen vill ha:

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

Om du använder IN-satsen mer lämpligt kan du skriva det som:

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

En sista notering, eftersom du hänvisar till en kolumn från tabellen LEFT JOINed i din WHERE-sats (tag.tag_id ), tvingar du verkligen det att bete sig som en INNER JOIN. För att verkligen få en LEFT JOIN, måste du flytta kriteriet från WHERE och göra det till en del av JOIN-villkoren istället:

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


  1. date_trunc 5 minuters intervall i PostgreSQL

  2. Hur kan denna SQL vara fel? Vad är det jag inte ser?

  3. MySQL - Byt namn på kolumn

  4. Sök efter flera nyckelord