2017-03-23 49 views
0

この質問に正しく言い方をするのは正確ではありませんので、データから始めます。テーブル1にテーブル2に一致する2行がある場合

この2つのテーブルを皮切り:

Table 1: 
user_id | equipment_id 
------ | ------ 
1  | 2 
1  | 3 
1  | 6 
2  | 2 
2  | 6 

Table 2: 
equipment_id | exercise_id 
------ | ------ 
2  | 1 
3  | 2 
6  | 2 
私は、この第三のテーブルを作成したいと思います

Table 3: 
user_id | exercise_id 
------ | ------ 
1  | 1 
1  | 2 
2  | 1 

単純なINNERがデータを取得するために、JOINのように思えるが、私は実行しています2列目のトラブルに。 user_id 1に表2に示す機器の両方がある場合にのみ、その行が表示されます。いずれかの機器が見つからない場合、user_id 2のようにデータを挿入しないようにします。また、それぞれの機器に対してuser_id 1の2つのインスタンスを取得しないでください。

この

は、私がこれまで持っているコードです:

INSERT INTO Table3 (user_id, exercise_id) 
SELECT user_id, exercise_id 
FROM Table1 
INNER JOIN Table2 
ON Table2.equipment_id = Table1.equipment_id 

私が得る結果である除去する必要がある行を持つこれが示された:

Table 3: 
user_id | exercise_id 
------ | ------ 
1  | 1 
1  | 2 
1  | 2 <--- duplicate of row above 
2  | 1 
2  | 2 <--- user 2 doesn't have equipment 3, so shouldn't be included 

任意の助けを結果を制限する上だろう大変感謝します。ありがとうございました!

+0

サンプルデータと予想される出力が一致しないと思います。あなたは再確認できますか? – Utsav

+0

あなたのテーブルには、どのユーザが運動をしているか、どのユーザが運動していないかを示すための関係がないため、あなたの関係は正しくないと思います。 –

+0

* user_id 1には両方の機器があります* - あなたが意味することを明確にすることはできますか?テーブル2には3つの機器があります – GurV

答えて

0

私が正しく理解していれば、あなたはその運動のために必要なすべての機器がユーザーに「利用可能」であるユーザーのすべての演習を取得します。 rextester.com/AYRE74108にコードを書きました。その重要な部分は次のようになります。

select distinct 
    t1.user_id, 
    t2.exercise_id 
from 
    table_1 t1 
JOIN table_2 t2 ON 
    t1.equipment_id = t2.equipment_id 
where 
    not exists 
    (select 1 
    from 
     table_2 t2b 
    where 
     t2b.exercise_id = t2.exercise_id 
     AND not exists (select 1 
         from 
          table_1 t1b 
         where 
          t2b.equipment_id = t1b.equipment_id 
          AND t1.user_id = t1b.user_id) 
    ) 

はロジックを説明するために:私は標準で始まり参加しdistinct。しかし、私は、そのユーザー/機器の組み合わせがNOT EXISTであるような運動のために必要な器具のいずれかをNOT EXISTに必要とします。これは、ユーザがエクササイズに必要なすべての機器を「利用可能」(表1にリストされている)にしなければならないと言うことに相当します。

「またはすべてのXはY」===「NO XはNot Yと同じです」。

+0

これは完璧に機能しました!ありがとうございました! –

0

出力の最後の行が2にならないと感じます。 2しかし1 | 2.

また、distinctを使用すると、重複する行がないことが保証されます。

SELECT DISTINCT user_id, exercise_id 
FROM Table1 
INNER JOIN Table2 
ON Table2.equipment_id = Table1.equipment_id 

編集 - 質問の間違いが私を捨てました。これはうまくいくはずです。

SELECT user_id, table2.exercise_id , sum(table2.equipment_id), sum(b.equipment_id) 
FROM Table1 
INNER JOIN Table2 
ON Table2.equipment_id = Table1.equipment_id 
inner join table2 as b 
on table2.exercise_id = b.exercise_id 
group by user_id, table2.exercise_id 
having sum(table2.equipment_id)= sum(b.equipment_id) 
+0

あなたは正しいです。私は表1の最後の行を間違って入力しました。私は間違いを訂正しました。 ご協力いただきありがとうございます。私が特定の状況でその仕事をすることができるかどうかがわかります。 –

+0

これは、2 | 2列? –

+0

その行は、質問の編集後にのみ表示され、私はそれに応じて私の答えを変更しました。 – Tarun

関連する問題