Mysql 选择相交用户
我有一张这样的桌子:Mysql 选择相交用户,mysql,sql,database,Mysql,Sql,Database,我有一张这样的桌子: 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的用户行中的所有列。像这样: ID USER INVENTORY [...] 1 A X 2 A
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的用户行中的所有列。像这样:
ID USER INVENTORY [...]
1 A X
2 A Y
4 B X
5 B Y
最有效的方法是什么?我的数据库中有大约300条IO记录,我需要从中获得几个不同的组合——这不是一次性的工作。我还是SQL新手,所以请记住这一点。
我在想两种可能的方法:
1) 某种嵌套的select语句(但我不知道如何编写它,从我所读到的内容来看,它们可能非常低效)
2) 为每个用户创建一个包含一组库存项目的新表,并将它们相交以获取用户。但这里的问题可能是集合最多只能包含64个元素,而且许多用户的库存中有更多的元素。
如果您有任何其他想法,请告诉我。试试这个:
select user from table where `INVENTORY` in ('X','Y') group by user having count(*)>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
)
或者如果您更愿意使用
连接
:
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')
最有效的方法可能是使用两个
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');
您需要在
表(用户,库存)
和表(库存)
上建立性能索引。让我们看看您对SQL的尝试?尝试使用WHERE
。这会让你开始。