php - MySql 多查询还是临时表?

标签 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...我该怎么做?我需要一个临时表还是可以以某种方式将表连接到自身?

编辑:所需的输出将是 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

这只返回键:

  • 只有 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) 通过使用相关子查询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/

相关文章:

php - 如何显示ORM组装的查询?

java - 如何禁用 Hibernate 的 SHOW WARNINGS?

php - Laravel Eloquent,返回两个条件都为 True 的行

mysql - SQL:链接两个表

sql - 按两列分组并在 PostgreSQL 中找到另一列的平均值

php - Elasticsearch 中的AND OR查询

php - 如何仅在超过特定日期时才启用 mysql 条件

javascript - 如何在 php 语言(或 javascript)上将 InDesign 文件与 XML 标签文件粘合?

php - 使用接受数组的 WHERE 子句进行 SQL 查询

javascript - 合并多对一的对象列表