2013-02-20 62 views
0

我有這個疑問:MySQL查詢 - 獲得列值「大於......」

$score = 10; 
SELECT timecode, count(tag) as n_tags, tag 
FROM dados 
WHERE dados.tag = 'tag1' 
AND dados.filename = 'file.mp4' 
AND (timecode >= '-5' AND timecode <= '15') 
AND (timecode = '$score') 
GROUP BY timecode 
ORDER BY count(tag) DESC 

不過,我想改變6行:

AND (timecode = '$score' AND n_tags > 3) 

,但它不似乎是正確的方式,它不起作用。

任何想法?

+0

你們都檢查相等'timecode ='$ score''並檢查它是否在'時間碼> = -5和時間碼<= 15'的範圍內。該範圍內是否有$ score? (爲什麼你需要的範圍呢?) – 2013-02-20 14:32:24

+0

是的!這是正確的... – zppinto 2013-02-20 14:33:24

+1

在進行數據庫查詢之前,測試$ score是否在-5到15之間,如果是則執行查詢 - 然後您可以消除AND(timecode> ='-5'AND timecode <= '15 ') – 2013-02-20 14:33:57

回答

2

從WHERE子句中刪除該行並放入HAVING子句。 HAVING子句將查看聚合結果。哪裏沒有。

SELECT timecode, count(tag) as n_tags, tag 
FROM dados 
WHERE dados.tag = 'tag1' 
AND dados.filename = 'file.mp4' 
AND (timecode >= '-5' AND timecode <= '15') 
AND (timecode = '$score') 
GROUP BY timecode 
HAVING count(tag) > 3 
ORDER BY count(tag) DESC 

此行是多餘的,可以被丟棄:AND(時間碼> = 5'和時間碼< = '15')

SELECT timecode, count(tag) as n_tags, tag 
FROM dados 
WHERE dados.tag = 'tag1' 
AND dados.filename = 'file.mp4' 
AND (timecode = '$score') 
GROUP BY timecode 
HAVING count(tag) > 3 
ORDER BY count(tag) DESC 
+2

有什麼區別? – 2013-02-20 14:33:06

+0

HAVING子句將查看聚合結果。哪裏沒有。 – Tom 2013-02-20 14:34:05

+0

@Tom問題是您的答案需要包含這些信息。沒有解釋的解決方案並不是一個真正的答案 - 這只是一個解決方案。 – 2013-02-20 14:36:07

2

你不能在WHERE使用聚合領域條款。 count()結果僅在考慮了所有適用的行後纔可用。但是where過濾是在每個單獨的行被解析時完成的。 Cliche聲明,但你試圖在他們孵化之前計數你的雞。

這樣的事情必須用HAVING子句完成,該子句基本上與where完全相同,但是在最終結果發送回客戶端之前應用。所以...

SELECT ..., count(tag) as n_tags 
... 
WHERE (timecode = '$score') 

HAVING (n_tags > 3)