我的桌子看起来像这样:
ID USER INVENTORY [...]
1 A X
2 A Y
3 A Z
4 B X
5 B Y
6 C X
7 C Z
我想选择在其库存中同时包含X和Y的USER行中的所有列。像这样:
ID USER INVENTORY [...]
1 A X
2 A Y
4 B X
5 B Y
最有效的方法是什么?我的数据库中有大约300条记录,我需要从中获得几种不同的组合 - 这不是一次性的工作。我还是SQL新手所以请记住这一点。 我想到了两种可能的方法: 1)某种嵌套的select语句(但我不知道如何编写它,从我读过的它们可能效率很低) 2)为每个用户创建一个包含一组库存项目的新表,并将它们相交以获得USER。但这里的问题可能是集合最多只能包含64个元素,而且许多用户在库存中拥有更多元素。 如果您有任何其他想法,请告诉我。
答案 0 :(得分:1)
这是使用条件聚合exists
的一种方式:
select id, user, inventory
from yourtable y
where inventory in ('X','Y') and exists (
select 1
from yourtable y2
where y.user = y2.user
group by user
having sum(inventory = 'X') > 0 and sum(inventory = 'Y') > 0
)
或者,如果您更愿意使用join
:
select y.id, y.user, y.inventory
from yourtable y
join (
select user
from yourtable
group by user
having sum(inventory = 'X') > 0 and sum(inventory = 'Y') > 0
) y2 on y.user = y2.user
where y.inventory in ('X','Y')
答案 1 :(得分:1)
最有效的方法可能是使用两个exists
语句:
select t.*
from table t
where t.inventory in ('X', 'Y') and
exists (select 1 from table t2 where t2.user = t.user and t2.inventory = 'X') and
exists (select 1 from table t2 where t2.user = t.user and t2.inventory = 'Y');
您需要table(user, inventory)
上的table(inventory)
和上的索引才能获得最佳效果。
答案 2 :(得分:0)
试试这个:
select user from table where `INVENTORY` in ('X','Y') group by user having count(*)>1