查找与指定的一组相关项目关联的项目数

时间:2016-01-08 15:21:49

标签: mysql

我有一张表Transactions,其中包含以下数据:

+------+---------+
|  id  |  item   |
+------+---------+
| 1    |    A    |
| 1    |    B    |
| 2    |    A    |
| 2    |    D    |
| 3    |    C    |
| 3    |    D    |
| 4    |    E    |
| 4    |    C    |
| 5    |    A    |
| 5    |    B    |
| 5    |    C    |
+------+---------+

如何找到包含指定项目集的交易数量?

例如,包含项目A和B的事务数量为2,因为只有事务1和5包含这两个项目。

3 个答案:

答案 0 :(得分:2)

我不确定你的意见是什么,但要解决你的问题,这将是

<强> Sql Fiddle Demo

这将统计包含AB

项的交易
SELECT count(*)
FROM (             
      SELECT id, count(*)
      FROM Table1
      GROUP BY `id`
      HAVING COUNT( CASE WHEN  `item` = 'A' THEN 1 END) > 0
         AND COUNT( CASE WHEN  `item` = 'B' THEN 1 END) > 0
      ) T

<强>输出

| count(*) |
|----------|
|        2 |

注意

子查询中的count(*)是可选的,只是将其添加到调试中以获得该子查询的可视化反馈。

答案 1 :(得分:0)

可能是这样的,虽然未经过测试:

SELECT A.id, count(A.item) AS cntA, count(B.item) AS cntB
FROM table AS A
LEFT JOIN table AS B
   ON (A.item = B.item) AND (A.id <> B.id)
GROUP BY A.id
HAVING cntA = cntB

自我将表加入具有相同项目的不同ID,并比较项目数。如果计数相同,则两个ID具有相同的项目。

答案 2 :(得分:0)

有点短,可能更快一点:

SELECT  id
    FROM  Transactions
    WHERE  item IN ('A', 'B')
    GROUP BY  id
    HAVING  COUNT(DISTINCT item) = 2