bugfix> mysql > 投稿

私は3つのテーブルがあります:

list_routes
pk_route_id  route_code  route_name route_description
3              J1          IND           IND-DPS
4              J4          ADT           ADT_DPS
tbl_stu_route
pk_stu_route_id    fk_stu_cls_id   fk_route_id
2                    13               3
tbl_stu_class
pk_stu_cls_id  fk_stu_id  
 13                56

今私が達成したいのは、tbl_stu_classに関連付けられていないまたは添付されていないlist_routesからレコードを取得するMYSQLでクエリを書くことですので、たとえば上記のシナリオでは出力が得られます:

pk_route_id  route_code  route_name route_description
4              J4          ADT           ADT_DPS

左外部結合を使用して以下のクエリを作成しました

SELECT
    a.pk_route_id,
    a.route_code,
    a.route_name,
    a.route_description
FROM
    list_routes a
left outer join tbl_stu_route b on a.pk_route_id=b.fk_route_id
left outer join tbl_stu_class c on b.fk_stu_cls_id=c.pk_stu_cls_id
where c.fk_stu_id ='56'

しかし、出力は

pk_route_id  route_code  route_name route_description
3              J1          IND           IND-DPS

どこが間違っているのかわかりません。これを達成する方法を教えてください。

回答 2 件
  • あなたが取得したい場合存在しません 記録してから、 IS NULL で除外するだけです

    SELECT a.*
    FROM list_routes a
    left outer join tbl_stu_route b on a.pk_route_id=b.fk_route_id
    left outer join tbl_stu_class c on b.fk_stu_cls_id=c.pk_stu_cls_id
    where b.fk_route_id is null;
    
    

  • あなたの質問の性質を考えると、私は not exists を使用します :

    SELECT lr.*
    FROM list_routes lr
    WHERE NOT EXISTS (SELECT 1
                      FROM tbl_stu_route sr JOIN
                           tbl_stu_class c 
                           ON sr.fk_stu_cls_id = c.pk_stu_cls_id
                      WHERE lr.pk_route_id = sr.fk_route_id AND
                            c.fk_stu_id = 56
                     );
    
    

    ノート:

    テーブルエイリアスを使用する場合は、テーブル名に略語を使用します。略語を使用すると、ランダムな文字よりもクエリを追跡しやすくなります。

    数値定数には一重引用符を使用しないでください。私はあなたのIDが数字であると仮定します、したがって 56   '56' ではなく 。

    私はその NOT EXISTS を見つけます   LEFT JOIN よりも問題の説明により適しています 、両方とも機能しますが。

あなたの答え