0

我对 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 的初学者,这真的很困扰我。

4

2 回答 2

1

您忘记添加GROUP BY子句

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
GROUP BY floor(datediff(now(), u.birth_date) / 365)
-- HAVING age >= 20 AND age <= 25
-- LIMIT 1
于 2012-12-24T00:16:58.497 回答
0

您的 SQL 查询很奇怪,因为您使用的是 MySQL 的一个(错误)功能,称为隐藏列。select在任何其他数据库中,这些查询都将违反语法,因为您在with no中同时具有聚合函数和非聚合列group by。这是个坏习惯。

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

在第二种情况下即使没有limit. 您将获得满足wherehaving条件的总计数和随机年龄。

您想要的查询是:

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

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

于 2012-12-24T18:12:59.270 回答