2016-03-04 207 views
0

我正在查詢我的數據庫中的一個表;使用COUNT返回不同的結果

  1. 確定最新video_seek值
  2. 返回總行

我與SQL沒有專家,並與一個說法我不能工作了,爲什麼在SQL語句中使用COUNT返回不同的結果那不使用COUNT。


查詢:

SELECT video_seek, COUNT(*) AS total 
FROM videos 
WHERE video_id = 1 
    AND video_seek > 0 
    AND video_seek_end > 0 
ORDER BY video_seek DESC 
LIMIT 1 

返回:

video_seek = 6012 
total  = 199 

查詢:

SELECT video_seek 
FROM videos 
WHERE video_id = 1 
    AND video_seek > 0 
    AND video_seek_end > 0 
ORDER BY video_seek DESC 
LIMIT 1 

返回:

video_seek = 7098 

總數是正確的,但video_seek是不是和我不知道爲什麼這取決於COUNT是否使用的結果是不同的。

任何意見將不勝感激。

+0

如果您使用了'COUNT(*)',您還需要'GROUP BY video_id'或您的主鍵。 – AkiEru

回答

3

這是一個MySQL peculiarity。如果您使用任何其他DBMS,則會收到「缺少GROUP BY表達式」語法錯誤。

COUNT()是一個聚合函數,它意味着它將幾行合併爲一個。如果您沒有GROUP BY子句,這意味着您想要將所有匹配的行合併爲一個,因此顯示單個行中的值沒有任何意義。正如我所說的,其他數據庫引擎只會警告你有關錯誤;相反,MySQL僅從任意行(甚至不是隨機行)中挑選數據。

我什麼都不知道你的數據或業務邏輯,但...

SELECT MAX(video_seek) AS max_video_seek, COUNT(*) AS total 
FROM videos 
WHERE video_id = 1 
AND video_seek > 0 
AND video_seek_end > 0 

(請注意SQL代碼接受換行符。)

+0

我嘗試使用GROUP BY作爲其他答案的建議,但那不起作用 - 返回相同的結果。但是使用MAX()似乎有訣竅。謝謝! – Reado

+1

請不要將代碼粘貼到論壇中,直到代碼不會崩潰。真正理解答案很重要。如果您想要**幾個組**(例如,獲取每個類別的最大值和計數),則可以使用「GROUP BY」。 –

+0

我明白你在說什麼,我感謝你的幫助。 :-) – Reado

1

您需要使用GROUP BY爲計數得到正確的解決方案