[英]MySql multiple queries or temporary table?
我需要来自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的其他任何键...我该怎么做? 我需要一个临时表,还是可以以某种方式将其自身联接起来?
编辑:所需的输出将是键100,因为它具有A和B,键300,因为它具有A,键400,因为它具有B。不是键500,因为它也包含C,而不是键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`)
这仅返回键:
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`)
通过使用相关的子查询SELECT COUNT(t2.value) FROM Table1 t2 WHERE t1.key = t2.key
,对于每个值t1.value
,将COUNT(t1.value)
与同一键的总值COUNT
相比较t1.value
。 因此,如果当前键包含的值不是'A', 'B'
则COUNT(t1.value)
将不等于同一键的所有值的COUNT
。 例如,键= 500的计数= 3,但使用:
SELECT DISTINCT t1.`key`
FROM table1 t1
WHERE t1.value in('A', 'B')
GROUP BY t1.`key`
如果没有HAVING
子句,则还将包含它,因为它具有A'
或'B'。 但是HAVING
子句消除了此键,因为它的count = 3不等于2。
您应该更好地解释您的问题,如果我能正确理解您的需求,则可以使用以下方法:
SELECT Distinct K
FROM tab
WHERE
value IN ('A', 'B') AND
NOT EXISTS (SELECT Null from tab tab_1
WHERE tab_1.K = tab.K and tab_1.value not in ('A', 'B'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.