2016-07-06 8 views
0

私はそうのような3つの定期的なテーブルと2つのリンクテーブルのスキーマを持っている:リンクテーブルは、ユーザーがどの試験/チュートリアルに参加しているかを決定のMySQL見つけるエントリは、

tutorial 
    id 

exam 
    id 

user 
    id 

exam_user 
    user 
    exam 

tutorial_user 
    user 
    tutorial 

。 試験IDから始めて、メンバー全員が試験に参加したチュートリアルを探しています。例えば

:ユーザ11が存在しないので、すべてのエントリが試験8であるが、チュートリアル3がないので

exam_user 
+----+-------+----------+ 
| id | exam | user  | 
+----+-------+----------+ 
| 23 |  8 |  1 | 
| 24 |  8 |  5 | 
| 25 |  8 |  8 | 
| 26 |  8 |  11 | 
| 27 |  8 |  12 | 
+----+-------+----------+ 

tutorial_user 
+----+----------+----------+ 
| id | tutorial | user  | 
+----+----------+----------- 
| 56 |  2 |  1 | 
| 57 |  2 |  5 | 
| 58 |  2 |  8 | 
| 59 |  2 |  11 | 
+----+----------+----------+ 
+----+----------+----------+ 
| id | tutorial | user  | 
+----+----------+----------- 
| 60 |  3 |  1 | 
| 61 |  3 |  5 | 
| 62 |  3 |  8 | 
| 63 |  3 |  15 | 
+----+----------+----------+ 

チュートリアル2が一致することになります。

上記を達成するための(比較的)効率的な方法はありますか?

+1

どの試験がどのチュートリアルに「所属している」ことをどのように知っていますか? – Osuwariboy

+0

これは多対多の関係として意図されていますが、データによって形成されています。そのようにして、新しいチュートリアルや試験にはそれぞれのデータが入力され、既存のデータとの関係が自動的に形成されます。 – ecstaticwalnut

+0

exam_tutorialテーブルがありませんか? – Strawberry

答えて

0

あなたはこのような何かを試してみてくださいについてはどのように:

+----+-------+----------+-------------+---------+ 
| id | exam | user  | Tutorial | User | 
+----+-------+----------+-------------+---------+ 
| 23 |  8 |  1 | 2   | 1  | 
| 23 |  8 |  1 | 3   | 1  | 
| 24 |  8 |  5 | 2   | 5  | 
| 24 |  8 |  5 | 3   | 5  | 
... 

select * from tutorial_user where tutorial not in 
(
    select tutorial from 
    (
     (
     select ex.exam, ex.user as ex_user, tut.tutorial as tutorial, 
     tut.user as tut_user from exam_user ex 
     inner join tutorial_user tut on 
     ex.User = tut.User 
     ) 
     union all 
     (
     select null, null, tutorial, user as tut_user from tutorial_user 
     ) 
    ) src 
    group by tutorial, tut_user 
    having count(tut_user) = 1 
) 

は今、最初のクエリはあなたに(基本的にすべてのユーザーのための試験やチュートリアルの組み合わせ)このように見えるリストを与える必要があります

次に、すべての次のクエリで労働組合を行うことによって、あなたはこのようなものになってしまいます:

+-----+-------+----------+-------------+---------+ 
| id | exam | user  | Tutorial | User | 
+-----+-------+----------+-------------+---------+ 
| 23 |  8 |  1 | 2   | 1  | 
| 23 |  8 |  1 | 3   | 1  | 
| 24 |  8 |  5 | 2   | 5  | 
| 24 |  8 |  5 | 3   | 5  | 
| null| null | null  | 2   | 1  | 
| null| null | null  | 2   | 5  | 
| null| null | null  | 2   | 8  | 
... 

基本的には、チュートリアルの表でユーザーを強調表示し、試験表では強調表示しないグループバイステートメントです。ハイライトはhaving()句で行われます。カウントが1の場合、チュートリアル・テーブルに試験テーブルにない人物がいます。ここで行う必要があるのは、チュートリアル表からチュートリアルを選択することです。チュートリアルは、見つかったものの一部ではなく、あなたは良いものでなければなりません。

関連する問題