查找在项目列表中缺少至少一个项目的商店

时间:2015-11-02 18:51:45

标签: mysql sql

我有以下(简化)表:

------------------
|store|item|value|
------------------
|    1|   1|    4|
|    1|   2|    3|
|    1|   3|    0|
|    2|   2|    2|
|    2|   3|    1|
|    3|   4|    2|

我想知道哪些商店缺少商品列表中的任何商品,我想知道他们拥有的商品的价值。项目列表通常比上面大,但通常一次只能搜索几个。

所以,我想说我想知道哪些商店缺少第1项或第2项中的任何一项。我希望这样的结果理想地:

-------------
|store| 1| 2|
-------------
|    2| 0| 2|
|    3| 0| 0|

不会返回商店1,因为它包含商品1和商品2的条目,其中每个商品的值大于0。最初我只需要商店ID,但是将项目作为列将其值放在行中将对我们现在需要的内容非常有帮助。我开始时将3个查询联合在一起,这可以很好地给出商店列表(第一列)。当我在考虑如何添加其他列时,我决定看看是否可以简化查询。我想出了这个:

select store
from table t1
where
(select count(*) 
 from (
   select store,item 
   from table t2 
   where t2.item in (1,2) and value != 0
   group by item,store
 ) t3 
 where t3.store = t1.store
) != 2

它的性能不如我的第一个较长的查询,但它没有给我我想要的列。我的想法是计算每个商店的匹配唯一商品的数量,如果该数量与查询的商品数量不匹配,则返回该商店,因为它缺少列表中的至少一个商品。

任何有关如何达到预期效果的指示或帮助都将不胜感激!

1 个答案:

答案 0 :(得分:1)

如果您希望每个商店有一行,那么您可以使用条件聚合:

select store,
       sum(case when item = 1 then value else 0 end) as item1,
       sum(case when item = 2 then value else 0 end) as item2
from table
group by store
having least(item1, item2) = 0;

这假设所有商店至少有一个任何类型的商品。