宿題をして、ネットやStackOverflowで情報を探しましたが、質問に対する答えが見つかりませんでした。私は見た:
テーブルの行から2つの列を作成する(理解していませんでした) MySQLは同じテーブルに列を表示する行を結合します(複雑)(違い、問題は同じではないようです) テーブルの行から2つの列を作成します
これを使用してクエリを作成しました。
次のようなテーブル「レッスン」があります。
ID title
---------
1 Math
2 Latin
3 English
4 Science
各レッスンで合格したテストユーザーのタイプを格納する2番目のテーブル「結果」があります。現在、oとwの2種類のテストがあります(将来さらに増える可能性があります)。表は次のようになります。
lesson_id usr_id test_type course_id
----------------------------------------
1 100 o 1
1 100 w 1
1 24 o 1
1 36 w 1
上記の表では、ユーザー100が数学のテストoとwに合格しました。上記の表では、ユーザー24が数学のテストoに合格しました。上記の表では、ユーザー36が数学のテストwに合格しました。
ここで、ユーザー100のレポートを取得したいのですが、次のようなものが必要です。
ID title o w
------------------------------
1 Math TRUE TRUE
2 Latin FALSE FALSE
3 English FALSE FALSE
4 Science FALSE FALSE
ユーザー36の場合:
ID title o w
------------------------------
1 Math FALSE TRUE
2 Latin FALSE FALSE
...
ユーザー24の場合:
ID title o w
------------------------------
1 Math TRUE FALSE
2 Latin FALSE FALSE
...
その他のユーザー:
ID title o w
------------------------------
1 Math FALSE FALSE
2 Latin FALSE FALSE
...
私は次のようにクエリでこれを達成することができます:
SELECT l.id, l.title, COALESCE(s.o,FALSE) AS o, COALESCE(t.w, FALSE) AS w FROM lessons l
LEFT JOIN (
SELECT r.lesson_id,
CASE
WHEN r.test_type='o' THEN TRUE
ELSE FALSE
END AS o
FROM results r WHERE r.itype='o' AND r.usr_id=100
) AS s ON l.id=s.lesson_id
LEFT JOIN (
SELECT rr.lesson_id,
CASE
WHEN rr.test_type='w' THEN TRUE
ELSE FALSE
END AS w
FROM results rr WHERE rr.test_type='w' AND rr.usr_id=100
) AS t ON l.id=t.lesson_id
WHERE l.course_id=1 ORDER BY l.id ASC;
このコードは機能しているように見えますが(まだテストで忙しいです)、2つの結合が必要であり、各結合は将来非常に大きくなる可能性のあるテーブルからの選択で構成されているため、私は好きではありません。このクエリは頻繁に実行されます
これを行うためのより良い方法を提案できますか(より良いとは、より賢く、より簡単で、より速く、または他の設計を意味する可能性があります...または他の提案:-))?
これに固執する必要がある場合、このクエリを高速に実行するための最適なインデックスを設定する方法として、参照をお勧めしますか?リンク、使用した記事は?
さらにtest_typesが作成されるとどうなりますか?私のクエリはwとoのみを使用します。明日もっとある場合はどうなりますか?この種のことを行う一般的な方法はありますか?
どんな助け/アドバイスも大歓迎です、
フィリップ