我有以下数据:
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语句中得到这个但是甚至没有接近解决方案。
感谢任何帮助。
答案 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
上添加一个索引(如果还没有),也可以使用其他一些索引(也许可以使用group
和user_id
上的复合索引)
答案 2 :(得分:0)
您可以使用聚合和having
获取符合条件的所有用户:
select userid
from t
group by userid
having sum( group = 'y' ) > 0 and
sum( group <> 'y') > 0;
我将它留给您将其放入查询中以获取所有原始行。