我想返回列中具有特定值的所有行,并且具有超过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,那么我想创建一个异常。我要求的查询将被插入到触发器中。结束编辑。
但我的桌子总是空的。谁能帮我吗?谢谢!
答案 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);
答案 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 *
,这通常是一种不好的做法:不要检索你实际上没有使用的数据,如果你正在使用它,那么花点时间输入一个列表对于字段,您可能会看到更快的查询,另一方面,代码将更具可读性。