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
。这会让你开始。