MySQL - 在 WHERE 子句中使用 COUNT(*)

Posted

技术标签:

【中文标题】MySQL - 在 WHERE 子句中使用 COUNT(*)【英文标题】:MySQL - Using COUNT(*) in the WHERE clause 【发布时间】:2010-09-23 00:59:12 【问题描述】:

我正在尝试在 mysql 中完成以下操作(参见 pseudo 代码)

SELECT DISTINCT gid
FROM `gd`
WHERE COUNT(*) > 10
ORDER BY lastupdated DESC

有没有办法在 WHERE 子句中不使用 (SELECT...) 来做到这一点,因为这看起来很浪费资源。

【问题讨论】:

【参考方案1】:
SELECT COUNT(*)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC;

编辑(如果你只想要 gids):

SELECT MIN(gid)
FROM `gd`
GROUP BY gid
HAVING COUNT(gid) > 10
ORDER BY lastupdated DESC

【讨论】:

谢谢乔,但它返回 COUNT() - 我希望返回所有 COUNT(*) 大于 10 的 gid 那里不需要Min()。【参考方案2】:

试试这个;

select gid
from `gd`
group by gid 
having count(*) > 10
order by lastupdated desc

【讨论】:

+1 表示这是 always 他们不费心在 sql 课程或书籍上正确教授的条款,并且通常知道它是编码人员进步的标志超出新手级别。 如果您尝试使用 COUNT() 作为布尔 OR 表达式的一部分怎么办?例如AND ((stock = 1 OR quantity > 0) OR (COUNT(v.id) > 0) 我想通了.. 你可以像这样添加到 HAVING 子句中:HAVING variations > 0 OR (stock = 1 OR quantity > 0) 优秀。如果可能的话,我可以给它+2。【参考方案3】:

我不确定你想要做什么......也许像

SELECT gid, COUNT(*) AS num FROM gd GROUP BY gid HAVING num > 10 ORDER BY lastupdated DESC

【讨论】:

MSSQL 给出了num“无效列名” 解析错误。无论如何 +1 以获得简洁的语法(可能是我的设置,或者 ms...啊,好吧)。 为选择中的所有列提供别名。【参考方案4】:

试试

SELECT DISTINCT gid
FROM `gd`
group by gid
having count(*) > 10
ORDER BY max(lastupdated) DESC

【讨论】:

【参考方案5】:

-- 搜索缺少半小时记录的气象站

SELECT stationid
FROM weather_data 
WHERE  `Timestamp` LIKE '2011-11-15 %'  AND 
stationid IN (SELECT `ID` FROM `weather_stations`)
GROUP BY stationid 
HAVING COUNT(*) != 48;

-- yapiskan 的变体,带有 where .. in .. select

【讨论】:

【参考方案6】:

我认为您不能将count()where 添加。现在看看为什么....

wherehaving 不一样,having 表示你正在工作或处理组和计数相同的工作,它也处理整个组,

现在如何计算整个团队的工作情况

创建一个表并输入一些id然后使用:

select count(*) from table_name

您会发现总值意味着它表示某个组!所以 where 确实添加了 count()

【讨论】:

【参考方案7】:

只是学术版本,没有子句:

select *
from (
   select gid, count(*) as tmpcount from gd group by gid
) as tmp
where tmpcount > 10;

【讨论】:

【参考方案8】:

WHERE 子句中不能有聚合函数(例如 COUNT、MAX 等)。因此,我们改用 HAVING 子句。因此,整个查询将与此类似:

SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value;

【讨论】:

【参考方案9】:

COUNT(*) 只能与 HAVING 一起使用,并且必须在 GROUP BY 之后使用 语句请看下面的例子:

SELECT COUNT(*), M_Director.PID FROM Movie
INNER JOIN M_Director ON Movie.MID = M_Director.MID 
GROUP BY M_Director.PID
HAVING COUNT(*) > 10
ORDER BY COUNT(*) ASC

【讨论】:

以上是关于MySQL - 在 WHERE 子句中使用 COUNT(*)的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 在 WHERE 子句中使用 COUNT(*)

在mysql select语句中使用条件where子句

在 WHERE 子句中使用连接列时,Mysql 未在 LEFT JOIN 中使用索引

在 MySQL 准备语句的 WHERE 子句中使用通配符

Mysql在where子句中优化子查询

Hibernate @Where 子句在 HSQL 和 MySQL 之间不一致