奇怪的MySQL行为与计数

奇怪的MySQL行为与计数,mysql,sql,Mysql,Sql,我对MySQL数据库有一个非常奇怪的问题 为了简化查询,假设我调用此查询以获取与用户设置匹配的配置文件: SELECT u.*, floor(datediff(now(), u.birth_date) / 365) as age FROM users_wr u LEFT JOIN cities c ON c.id = u.city_id WHERE u.id != 1 and c.country_id = 71 HAVING age >= 20 AND age <= 25 此

我对MySQL数据库有一个非常奇怪的问题

为了简化查询,假设我调用此查询以获取与用户设置匹配的配置文件:

SELECT u.*, floor(datediff(now(), u.birth_date) / 365) as age 
FROM users_wr u 
LEFT JOIN cities c ON c.id = u.city_id 
WHERE u.id != 1 and c.country_id = 71
HAVING age >= 20 AND age <= 25
此查询现在返回一组正确的3行。但是,当我想得到这样的行数时:

SELECT count(*), floor(datediff(now(), u.birth_date) / 365) as age 
FROM users_wr u 
LEFT JOIN cities c ON c.id = u.city_id 
WHERE u.id != 1 and c.country_id = 71
HAVING age >= 20 AND age <= 25
LIMIT 1
在另一种情况下,它应该返回4,但它一直返回5,在这种情况下,当它应该返回3时,它返回NULL

我不知道那是什么意思。我不是sql的初学者,这让我很困扰。

您忘记添加GROUPBY子句了


您的SQL查询很奇怪,因为您使用的是MySQL的一个称为隐藏列的错误特性。在任何其他数据库中,这些查询都会违反语法,因为在没有group by的select中既有聚合函数,也有非聚合列。这是个坏习惯

在第一种情况下,您将获得与条件匹配的调用行,因为没有聚合

在第二种情况下,即使没有限制,查询也只返回1行。您可以得到总计数和满足where和having条件的随机年龄

您需要的查询是:

select count(*)
from (SELECT u.*, floor(datediff(now(), u.birth_date) / 365) as age 
      FROM users_wr u LEFT JOIN
           cities c ON c.id = u.city_id 
      WHERE u.id != 1 and c.country_id = 71
     ) t
where age >= 20 AND age <= 25

这将返回一行,其中包含满足所有条件的用户数。

我不能使用group by,因为这将只计算每个年龄一次,可能会有很多相同年龄的用户。@kudlajz:你在说什么?这正是你需要的!你试过了吗?如果这对你不起作用,那么你的问题就不清楚了。请发布一些输入和输出示例,以演示您正在寻找的内容。你可能会发现这个网站很有用。如果你不使用分组方式,你的结果列表上肯定会有一个结果。
select count(*)
from (SELECT u.*, floor(datediff(now(), u.birth_date) / 365) as age 
      FROM users_wr u LEFT JOIN
           cities c ON c.id = u.city_id 
      WHERE u.id != 1 and c.country_id = 71
     ) t
where age >= 20 AND age <= 25