2012-12-24 76 views
0

我有这个MySQL数据库非常奇怪的问题。奇怪的MySQL行为与COUNT

为了简化查询,让我们只想说,我打电话此查询以获取配置文件匹配的用户设置:

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

回答

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 
+0

我不能使用group by,因为那会计算每个年龄一次,可以有很多年龄相同的用户。 – kudlajz

+1

@kudlajz:你在说什么?这正是你需要的!你甚至尝试过吗?如果这不适合你,那你的问题就不清楚了。请张贴一些示例输入和输出来演示您正在寻找的内容。您可能会发现网站http://sqlfiddle.com有用。 –

+0

如果您不使用GROUP BY,您的结果列表中肯定会有一个结果。 –

0

你的SQL查询是怪异的,因为你正在使用MySQL的(MIS)的功能,称为隐藏列。在任何其他数据库中,这些查询都会违反语法,因为您在select中既有聚合函数又有非聚合列,而没有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 

这应返回一行与满足所有条件的用户的数量。