我需要 SQL 专家的帮助...
我有以下格式的数据:
Key Value
100 A
100 B
300 A
400 B
500 A
500 B
500 C
600 B
600 W
如果我想找到带有 A 或 B 和 A 和 B 的所有键,但不包含带有其他任何键的 AB...我该怎么做?我需要一个临时表还是可以以某种方式将表连接到自身?
编辑:所需的输出将是 key 100,因为它有 A 和 B, key 300,因为它有 A, key 400,因为它有 B。不是 key 500,因为它也包含一个 C,而不是 key 600,因为它也包含一个 W
最佳答案
这应该适合你:
SELECT DISTINCT t1.`key`
FROM table1 t1
WHERE t1.value in('A', 'B')
GROUP BY t1.`key`
HAVING COUNT(t1.value) = (SELECT COUNT(t2.value)
FROM Table1 t2
WHERE t1.`key` = t2.`key`)
SQL Fiddle Demo
这只返回键:
- 只有
A
和B
,没有别的所以key = 500
不应该返回。但是key = 100
应该包括在内。 - 只有
A
。如key = 300
。 - 只有
B
所以key = 600
不应该返回,因为它包含的值比B
多一个w
。但是key = 400
应该包括在内。
更新:这是如何运作的
如果任何键有一个值 IN('A', 'B')
那么它也可以包含其他值。
这就是我添加 HAVING
子句的原因:
HAVING COUNT(t1.value) = (SELECT COUNT(t2.value)
FROM Table1 t2
WHERE t1.`key` = t2.`key`)
COUNT(t1.value)
通过使用相关子查询SELECT COUNT(t2 .value) FROM Table1 t2 WHERE t1.key = t2.key
,对于每个值 t1.value
。因此,如果当前键包含 'A', 'B'
以外的值,则 COUNT(t1.value)
将不等于 COUNT
同一键的所有值。例如 key = 500 有一个 count = 3 但使用:
SELECT DISTINCT t1.`key`
FROM table1 t1
WHERE t1.value in('A', 'B')
GROUP BY t1.`key`
没有 HAVING
子句也会包含它,因为它有 A'
或 'B'。但是 HAVING
子句消除了这个键,因为它的计数 = 3 不等于 2。
关于php - MySql 多查询还是临时表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13270945/