3つのテーブルを続けてプライマリテーブルに結合するMySQLクエリを作成しようとしていますが、これは、結合される最後のテーブルの値に基づいて条件付きで実行されます。私がやろうとしている2つの方法には、どちらも問題があります。
- 必要なすべてのプライマリ行が表示されていないか
- または、そこに無関係な行がいくつかあります。
テーブル構造は既存のシステムの一部であり、変更することはできません。また、SQLを理解したら、これをクエリシステムと統合する方法を見つける必要があるため、SQLは単純であるほど優れています。
ここに多くの詳細を載せます。申し訳ありませんが、これは非常に長い投稿ですが、すべての情報を含める方がよいと思いました。
詳細は次のとおりです。
データ・モデル:
ユーザー、コース、およびcuiと呼ばれる特定のコースの各ユーザーのユーザー情報を格納する中間コンテンツタイプがあります。すべてのユーザーのリストを確認する必要があります。そのユーザーとコースのcuiがある場合は、それも含める必要があります。
データベースでは、cuiのフィールドの内容は別々のテーブルに格納され、問題の一部であるcui_idを介して結合されます。
簡素化されたデータベース構造:
- プライマリテーブル:ユーザー(フィールド:uid、名前)
- Cuiテーブル:ノード(フィールド:cui_id)
- ユーザーフィールドテーブル(フィールド:cui_id、uid)
- コースフィールドテーブル(フィールド:cui_id、course_id)
参加する
user user_field node course_field
---- ---------- ------- ------------
uid ==== uid
name cui_id =========== cui_id ===== cui_id
course_id = 202
試行されたクエリ:
次のクエリは、次のユーザーを使用して小さなサンプルデータセットで実行されます。
- ユーザー2:照会されたコースのキューがあり、他のコースのキューがあります。
- ユーザー1:他のコースの手がかりはありますが、質問されたコースの手がかりはありません。
- ユーザー6:手がかりがありません。
この最初のクエリは最後のテーブルの条件付き結合です。問題は、正しいcuiではないユーザー2の余分な行が含まれていることです。必ずしも正しい行が表示されるとは限らないと思ったので、GROUPBYを使用したくありませんでした。
SELECT user.uid, user.name, field_user.cui_id,
field_course.course_id
FROM user
LEFT JOIN field_user
ON
user.uid = field_user.uid
LEFT JOIN node AS cui
ON
cui.id = field_user.cui_id
LEFT JOIN field_course
ON
field_course.cui_id = cui.id
AND
field_course.course_id = 202
結果:
uid name cui_id course_id
---------------------------------------------
4 User One 772 NULL
5 User Two 434 202
5 User Two 771 NULL
35 User Six NULL NULL
代替案はこれです:
SELECT user.uid, user.name, field_user.cui_id,
field_course.course_id
FROM user
LEFT JOIN field_user
ON
user.uid = field_user.uid
LEFT JOIN node AS cui
ON
cui.id = field_user.cui_id
LEFT JOIN field_course
ON
field_course.cui_id = cui.id
WHERE (
field_course.course_id = 202 OR ISNULL(field_course.course_id))
結果:
uid name cui_nid course_nid
---------------------------------------------
5 User Two 434 202
35 User Six NULL NULL
その問題は、ユーザー1が他の手がかりを持っているため、ユーザー1が除外されていることです。これは、正しいコースではありません。
だから問題は、どうやってこれを手に入れるのかということです。
uid name cui_id course_id
--------------------------------------------
4 User One 772 NULL
5 User Two 434 202
35 User Six NULL NULL