2009-08-19 130 views
6

我的問題是非常相似,這一個How to reference a custom field in SQL我有以下查詢自定義字段:使用WHERE SQL查詢的WHERE子句

SELECT * , (SELECT COUNT(id) 
FROM cms_store_items 
WHERE speaker = cms_store_items_speakers.id 
) AS count 
FROM cms_store_items_speakers 
LIMIT 0 , 30 

我需要補充的是看起來像WHERE count > 0 WHERE子句,但是當我做我得到錯誤Unknown column 'count' in 'where clause'反正我有沒有重複邏輯引用我的where子句中的自定義字段?

我可以在代碼中放置where子句的邏輯,但如果不需要,我不想發送超過1000行的應用程序到應用程序,它看起來像是浪費資源。

回答

16

好,要做到這一點嚴格的你正在做的方式:

select 
* 
from 
(
    SELECT * , (SELECT COUNT(id) 
    FROM cms_store_items 
    WHERE speaker = cms_store_items_speakers.id 
    ) AS count 
    FROM cms_store_items_speakers 
) a 
where a.count > 0 
LIMIT 0 , 30 

它可能是更好的做到以下幾點,雖然。它充分利用了having條款:

select 
    s.id, 
    s.col1, 
    count(i.speaker) as count 
from 
    cms_store_items_speakers s 
    left join cms_store_items i on 
     s.id = i.speaker 
group by 
    s.id, 
    s.col1 
having 
    count(i.speaker) > 0 
limit 0, 30 
+0

第一個選項很好,看起來我更早(現在刪除的評論是由於緩存),謝謝你的解決方案。 – UnkwnTech 2009-08-19 02:03:42

+0

更改計數(\ *)來計數(i.speaker),並有計數(\ *)來計數(i.speaker),只是防未來的代碼;如果需要計數零匹配出現,那麼只需將內部連接更改爲左連接,我將upvote您的答案:) – 2009-08-19 02:10:13

+0

@邁克爾:好趕上!謝謝! – Eric 2009-08-19 02:13:39

0

我不是100%地肯定MySQL,但是這樣的事情應該是非常有可能的:

(SELECT 
    * 
FROM 
(
    SELECT cms_store_items_speakers.*, 
      (SELECT COUNT(id) FROM cms_store_items 
      WHERE speaker = cms_store_items_speakers.id) AS 'count' 
    FROM cms_store_items_speakers) 
    LIMIT 0, 30 
) 
WHERE count > 0; 
+1

你限制得太早。 – Eric 2009-08-19 02:02:18

10

可以使用HAVING條款改爲:

... 
) AS count 
FROM cms_store_items_speakers 
HAVING count > 0 
LIMIT 0 , 30 

HAVING就像WHERE但它能夠在計算的列上工作。 警告:HAVING通過修剪結果查詢的其餘部分已經運行 - 它不是替代WHERE子句。