2012-06-08 99 views
1

我無法理解該查詢:瞭解此查詢(COUNT與子查詢)

SELECT * 
    FROM `advertise` parent 
WHERE 3 <= (SELECT COUNT(username) 
       FROM `advertise` 
       WHERE keyword = parent.keyword 
        AND bid > parent.bid) 
    AND username = 'mike' 

什麼這個查詢的作用是顯示用戶名爲'mike'任何行;如果該行不是關鍵字的三個最高出價。

這裏是sqlfiddle that works,但我不明白它是如何工作的。更具體地說,我不明白3 <=與這個特定的查詢。

3 <=如何確定該行不是關鍵字的三個最高出價?

+1

SELECT COUNT(...)返回一個整數 –

+1

3更改爲4在SQL提琴。這有幫助嗎? – Ben

+0

,但仍不能解釋它如何確定該行不在三個最高結果中。這意味着查詢看起來像這樣一次返回SELECT * FROM'advertise' parent WHERE 3 <= 2 AND username ='mike' – user892134

回答

2

此查詢的工作,像這樣:

子查詢

SELECT COUNT(username) FROM `advertise` WHERE keyword = parent.keyword AND bid > parent.bid 

發現有相同的關鍵字出價更高的行數。然後,我們指定我們正在查找的出價不能在前三個出價中,因此我們要求從該查詢中返回至少3個出價。以下是我認爲你的最終查詢應該是這樣的:

SELECT * FROM `advertise` parent 
WHERE 3 <= (SELECT COUNT(username) 
    FROM `advertise` 
    WHERE keyword = parent.keyword 
    AND bid > parent.bid) 
AND username = 'mike' 
+0

+1對於格式相同的代碼(也是很好的解釋):) – bendataclear

+0

爲什麼你使用至少有4個出價? – user892134

+0

我已將它更新爲3.我不得不重新考慮它,但我相信3是正確的答案。 – FreeAsInBeer

1

它可以由簡單一點看,如果是稍微重新格式化:

SELECT * FROM `advertise` parent 

WHERE (SELECT COUNT(username) 
    FROM `advertise` 
    WHERE keyword=parent.keyword 
    AND bid>parent.bid) >= 3 

AND username='mike' 

子查詢評估每行從父查詢返回所以它會爲每一行做X >= 3