MySql多个查询还是临时表?

时间:2012-11-07 13:38:28

标签: php mysql sql

我需要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

2 个答案:

答案 0 :(得分:1)

这应该适合你:

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

这只返回键:

  • 仅限AB,并且不应返回任何其他内容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)

通过对每个值COUNT使用相关子查询SELECT COUNT(t2.value) FROM Table1 t2 WHERE t1.key = t2.key,将t1.value与同一个键值的总'A', 'B'进行比较。因此,如果当前密钥包含COUNT(t1.value)以外的值,则COUNT将不等于同一密钥的所有值的SELECT DISTINCT t1.`key` FROM table1 t1 WHERE t1.value in('A', 'B') GROUP BY t1.`key` 。例如,key = 500的count = 3,但使用:

HAVING

如果没有A'子句,它也会包含它,因为它有HAVING或'B'。但{{1}}子句删除了此键,因为它的count = 3不等于2。

答案 1 :(得分:0)

你应该更好地解释你的问题,如果我能正确理解你需要什么,你可以使用这样的东西:

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'))