2012-12-24 69 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 

這應返回一行與滿足所有條件的用戶的數量。