sql >> データベース >  >> RDS >> Mysql

MYSQL結合結果は、where句のIN()中にワイプされた結果を設定しますか?

    コードが論理的に何をしているのか考えてみてください:

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

    と同等です
    ( 1 = (tag.tag_id) ) AND (2 = (tag.tag_id) )
    

    tag.tag_idはありません 両方の条件を満たすことができるため、ANDが真になることはありません。

    質問で引用したORバージョンが本当に必要なもののようです:

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

    IN句をより適切に使用すると、次のように記述できます。

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

    最後に、WHERE句(tag.tag_id)でLEFTJOINedテーブルの列を参照しているためです。 )、あなたは本当にそれをINNERJOINのように振る舞わせています。 LEFT JOINを実際に取得するには、基準をWHEREから移動し、代わりにJOIN条件の一部にする必要があります。

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


    1. Java例外エラー-SqlitepreparedStatement.setBlob

    2. 条件に基づいてクエリを更新する

    3. GoDaddyがホストするサイトでPHP.iniを更新する

    4. MySQL:フラット/会話メッセージテーブルの最後のメッセージのみを返します