帮助MySQL查询只选择列中具有特定值的记录

时间:2010-01-28 13:09:57

标签: mysql

我有以下表格:

+--------+-----------+--------+
|   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   |
+--------+-----------+--------+

感谢。

4 个答案:

答案 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秒)