选择相交用户

时间:2015-03-09 14:26:34

标签: 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的USER行中的所有列。像这样:

    ID  USER  INVENTORY [...]
    1    A     X
    2    A     Y
    4    B     X
    5    B     Y

最有效的方法是什么?我的数据库中有大约300条记录,我需要从中获得几种不同的组合 - 这不是一次性的工作。我还是SQL新手所以请记住这一点。 我想到了两种可能的方法: 1)某种嵌套的select语句(但我不知道如何编写它,从我读过的它们可能效率很低) 2)为每个用户创建一个包含一组库存项目的新表,并将它们相交以获得USER。但这里的问题可能是集合最多只能包含64个元素,而且许多用户在库存中拥有更多元素。 如果您有任何其他想法,请告诉我。

3 个答案:

答案 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