如果表1在表2中有2行匹配,则为INNER JOIN

时间:2017-03-23 04:11:33

标签: mysql sql

我并不完全知道如何正确地说出这个问题,所以我会从数据开始,因为我觉得这样会更有意义。

从这两个表开始:

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

非常感谢任何有关限制结果的帮助。谢谢!

2 个答案:

答案 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”。