我并不完全知道如何正确地说出这个问题,所以我会从数据开始,因为我觉得这样会更有意义。
从这两个表开始:
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,但我在第二行遇到了麻烦。如果user_id 1具有表2中列出的两个设备,我只希望显示该行。如果缺少任何一个设备,我不希望插入数据,如user_id 2所示。我也想制作确定我没有为每件设备获得两个user_id 1实例。
这是我到目前为止的代码:
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 :(得分: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)
答案 1 :(得分: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”===“否则X是不是Y”。