SQL查询 - 查找具有不同键的重复项

时间:2017-07-04 13:06:00

标签: mysql sql

我有以下数据:

id  userid  name    group
1   1       A       x
2   1       A       y
3   1       A       z
4   2       B       x
5   2       B       y
6   3       C       y
7   4       D       x
8   5       E       x
9   5       E       z
10  6       F       x

我想找到满足所有这些条件的记录:

选择a用户标识属于y 以外的组的所有行,但用户标识也属于y

结果数据集如下:

id  userid  name    group
1   1       A       x
3   1       A       z
4   2       B       x

如果你看到,它为userid a产生了两条记录,因为这两条记录属于y以外的组,但是userid 1也属于y组。对于用户标识2也是如此。

我一直在讨论如何在SQL语句中得到这个但是甚至没有接近解决方案。

感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

使用exists

select *
from MyTable a2
where name_group <> 'y'
and exists (select 1 
            from MyTable a2
            where a2.name_group = 'y' 
            and a2.userid = a1.userid)

答案 1 :(得分:1)

使用联接:

SELECT t1.*
FROM mytable t1
INNER JOIN mytable t2
ON t1.user_id = t2.user_id AND t1.group <> t2.group AND t2.group = 'y'

我认为这是最快的查询(但请随意尝试其他解决方案)。 在user_id上添加一个索引(如果还没有),也可以使用其他一些索引(也许可以使用groupuser_id上的复合索引)

答案 2 :(得分:0)

您可以使用聚合和having获取符合条件的所有用户

select userid
from t
group by userid
having sum( group = 'y' ) > 0 and
       sum( group <> 'y') > 0;

我将它留给您将其放入查询中以获取所有原始行。