当查询计数大于数字时返回查询?

时间:2013-11-18 07:47:24

标签: mysql sql count group-by having

我想返回列中具有特定值的所有行,并且具有超过5个实例,其中数字是该特定值。例如,我想返回条件的所有行,如果列M中的值的数字为1,并且有5个或更多M的实例,其中数字为1,那么它将返回所有行有这种情况。

select * 
from tab 
where M = 1 
group by id --ID is the primary key of the table
having count(M) > 5;
编辑:这是我的表:

 id |    M       | price
--------+-------------+-------

  1 |             |   100
  2 |           1 |    50
  3 |           1 |    30
  4 |           2 |    20
  5 |           2 |    10
  6 |           3 |    20
  7 |           1 |     1
  8 |           1 |     1
  9 |           1 |     1
 10 |           1 |     1
 11 |           1 |     1

最初我只是想插入一个触发器,这样如果M = 1的数量大于5,那么我想创建一个异常。我要求的查询将被插入到触发器中。结束编辑。

但我的桌子总是空的。谁能帮我吗?谢谢!

4 个答案:

答案 0 :(得分:0)

please try

select *,count(M) from table where M=1 group by id having count(M)>5

答案 1 :(得分:0)

试试这个:

select * 
from tab 
where M in (select M from tab where M = 1 group by M having count(id) > 5);

SQL Fiddle Demo

答案 2 :(得分:0)

既然你对你的PK进行分组(这似乎是徒劳的练习),你就是在计算每个ID,而且确实总是会返回1.

正如我在此代码之后解释的那样,这个查询不好,它不是答案,我也解释为什么。请不要指望此查询正确运行!

select * 
from tab 
where M = 1 
group by M 
having count(*) > 5;

就像这样,你可以分组你正在计算的东西,这更有意义。同时,这会产生意外行为,因为您正在选择不在组中或在任何聚合中的所有类型的列。我知道mySQL对此很宽容,但我不想知道它会产生什么。

沿着这些方向尝试确实是一个子查询:

select * 
from tab 
where M  in 
(SELECT M
from tab 
group by M 
having count(*) > 5)

答案 3 :(得分:0)

我已经构建了一个SQLFiddle demo(我习惯使用'Test'作为表名)来完成这个(我现在手头没有mySQL来测试它)。

-- Made up a structure for testing
CREATE TABLE Test (
    id INT NOT NULL AUTO_INCREMENT, 
        PRIMARY KEY(id),
    M int
);

SELECT id, M FROM tab
WHERE M IN (
  SELECT M
  FROM Test
  WHERE M = 1
  GROUP BY M
  HAVING COUNT(M) > 5
)

子查询是一种常见的“查找重复”类型的查询,其中添加了M列的特定值的条件,同时声明必须至少有5个dupes。

它将吐出一系列M的值,您可以使用这些值查询表格,以您需要的行结束。

你不应该使用SELECT *,这通常是一种不好的做法:不要检索你实际上没有使用的数据,如果你正在使用它,那么花点时间输入一个列表对于字段,您可能会看到更快的查询,另一方面,代码将更具可读性。