2010-01-17 18 views
0

因此,我想將WHERE條件應用於由COUNT()AS子句分配的字段。我的查詢目前看起來是這樣的:SQL在不同的表上COUNT

SELECT new_tags.tag_id 
     , new_tags.tag_name 
     , new_tags.tag_description 
     , COUNT(DISTINCT new_tags_entries.entry_id) AS entry_count 
FROM (new_tags) 
JOIN new_tags_entries ON new_tags_entries.tag_id = new_tags.tag_id 
WHERE `new_tags`.`tag_name` LIKE '%w' 
AND `entry_count` < '1' 
GROUP BY new_tags.tag_id ORDER BY tag_name ASC 

多數民衆贊成失敗位是WHERE子句中的ENTRY_COUNT - 它不知道ENTRY_COUNT列是什麼。我的表看起來像這樣:

new_tags { 
    tag_id INT 
    tag_name VARCHAR 
} 

new_tags_entries { 
    tag_id INT 
    entry_id INT 
} 

我想,以濾除不同entry_ids中,涉及到標籤ID new_tags_entries數的結果。

有意義嗎?

在此先感謝。

+1

不禁注意到'ENTRY_COUNT <「1''。不要引用'1' - 你不想看看它是否等於一個字符串,其中包含「1」的內容,如果發現少於一次,就會發現它。 –

回答

2

要過濾aggegated值使用HAVING條款等

SELECT 
    new_tags.tag_id, new_tags.tag_name, 
    new_tags.tag_description, 
    COUNT(DISTINCT new_tags_entries.entry_id) AS entry_count 
FROM (new_tags) 
JOIN new_tags_entries ON new_tags_entries.tag_id = new_tags.tag_id 
WHERE `new_tags`.`tag_name` LIKE '%w' 
GROUP BY new_tags.tag_id 
HAVING COUNT(DISTINCT new_tags_entries.entry_id) < '1' 
ORDER BY tag_name ASC 
+0

這很完美,非常感謝。 –

+0

實際上,'ORDER BY'應該在'HAVING'之後。有些MySQL版本可以允許有前後的命令,但標準sql需要命令以後才能出現。比如MySQL 5.1.36之前不會允許排序。 –

+0

@Roland - 很好的捕捉。恐怕我只是在沒有正確閱讀的情況下將已發佈的代碼打掉。 – APC

1

一個內連接永遠不會少於1的計數。也許左連接和IS NULL會有所幫助。那,或者用SUM()代替。

+0

+用於'LEFT JOIN'。雖然 –

+0

SUM()可以幫助如果條目的數量保存在某個字段的某個字段,但我不明白SUM有多大幫助。 –

0
SELECT 
    new_tags.tag_id, new_tags.tag_name, 
    new_tags.tag_description, 
    COUNT(DISTINCT new_tags_entries.entry_id) AS entry_count 
FROM (new_tags) 
LEFT JOIN new_tags_entries ON new_tags_entries.tag_id = new_tags.tag_id 
WHERE `new_tags`.`tag_name` LIKE '%w' 
GROUP BY new_tags.tag_id ORDER BY tag_name ASC 
HAVING `entry_count` < '1' 
1

雖然APC的答案是語法正確的,如果你正在試圖解決的問題確實是:「給我找所有new_tags沒有任何news_tags_entries「,那麼INNER JOINGROUP BYHAVING的查詢將不會產生正確的結果。事實上,它總是會產生空集。

正如Ignacio Vazques Abrahams指出的,LEFT JOIN將起作用。你甚至都不需要GROUP BY/HAVING

SELECT news_tags.* 
FROM  news_tags 
LEFT JOIN news_tags_entries 
ON  news_tags.tag_id = news_tags_entries.tag_id 
WHERE  news_tags_entries.tag_id IS NULL 

(當然,你仍然可以添加GROUP BYHAVING如果你有興趣知道有多少項目有,而不是隻是想找到news_tags與零news_tags_entries,但LEFT JOIN從news_tags到news_tags_entries必須有,否則你將失去在news_tags_items沒有相應的另一個項目,解決了「讓我所有對此有X更明確的方式news_tags)

是否是y「是相關的NOT EXISTS解決方案:

SELECT news_tags.* 
FROM  news_tags 
WHERE NOT EXISTS (
      SELECT NULL 
      FROM news_tags_entries 
      WHERE news_tags_entries.tag_id = news_tags.tag_id 
     ) 

雖然不錯,明確的,該解決方案通常是避之唯恐不及在MySQL因爲很壞的子查詢性能