sql >> Database teknologi >  >> RDS >> Mysql

MYSQL join-resultater sæt slettede resultater under IN () i hvor-klausul?

Tænk over, hvad din kode logisk gør:

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

svarer til

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

Der er ingen måde tag.tag_id kan opfylde begge betingelser på samme tid, så OG er aldrig sandt.

Det ser ud til, at den OR-version, du citerede i dit spørgsmål, er den, du virkelig ønsker:

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

Hvis du bruger IN-sætningen mere passende, kan du skrive det som:

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

En sidste bemærkning, fordi du refererer til en kolonne fra tabellen LEFT JOINed i din WHERE-sætning (tag.tag_id ), tvinger du virkelig det til at opføre sig som en INNER JOIN. For virkelig at få et LEFT JOIN, skal du flytte kriterierne ud af WHERE og gøre det til en del af JOIN-betingelserne i stedet:

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


  1. Sådan registrerer du, om en værdi indeholder mindst ét ​​tal i SQL Server

  2. Antal median grupperet efter dag

  3. Undlader at bygge mysql connector/c (libmysql) fra kilden i cygwin

  4. UDENLANDSKE NØGLE PÅ SLETNINGSRESTRICT Fejl - Oracle