我有以下表格:
+--------+-----------+--------+
| ID | Title | Stat |
+--------+-----------+--------+
| 1 | title a | 1 |
+--------+-----------+--------+
| 1 | title b | 0 |
+--------+-----------+--------+
| 2 | title c | 1 |
+--------+-----------+--------+
| 2 | title d | 1 |
+--------+-----------+--------+
| 3 | title e | 0 |
+--------+-----------+--------+
| 3 | title f | 1 |
+--------+-----------+--------+
| 3 | title g | 1 |
+--------+-----------+--------+
我需要构建一个查询,结果只会包含那些记录,其中列Stat中的 ALL 值符合特定条件。
对于上表,如何制定一个基本上意味着的查询:仅显示那些具有Stat = 1列中所有值的ID的记录,并因此产生下表?
+--------+-----------+--------+
| 2 | title c | 1 |
+--------+-----------+--------+
| 2 | title d | 1 |
+--------+-----------+--------+
感谢。
答案 0 :(得分:2)
这样的东西?
SELECT
*
FROM table t
LEFT JOIN (
SELECT
MIN(Stat) AS Stat,
ID
FROM table
GROUP BY ID
) minstat ON t.ID = minstat.ID
WHERE minstat.Stat = 1;
基本上,子查询计算每个ID的最小统计量,而外部查询仅选择最小stat等于1的行。如果所有行都需要满足某个条件,则插入一个布尔表达式而不是最小。
不确定在没有子查询的情况下是否可行。
答案 1 :(得分:0)
这也有效,
SELECT * FROM tablename t1
WHERE (
SELECT COUNT(*) FROM tablename t2
WHERE t1.ID = t2.ID AND t2.STAT = 0
) = 0
此查询检查,是具有相同ID的记录中值为0的STAT。
答案 2 :(得分:0)
这个怎么样:
select * from t where not (id in (select id from t where stat=0));
答案 3 :(得分:0)
以上所有3个建议的解决方案都运行良好,差异仅在于执行速度。在大约7000个结果中找到3条记录的表格中:
Martijn's:显示0到2行(总共3行,查询花了0.0069秒)
Alex's:显示0到2行(总共3行,查询花了0.1162秒)
Pavelasc's:显示0到2行(总共3行,查询耗时0.6160秒)