SQL在另一个表的COUNT上

时间:2010-01-17 10:06:46

标签: sql mysql join count

因此,我想将WHERE条件应用于由COUNT()AS子句指定的字段。我的查询目前看起来像这样:

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
}

我想按照与标签ID相关的new_tags_entries中的不同entry_id的数量来过滤结果。

有意义吗?

提前致谢。

4 个答案:

答案 0 :(得分:2)

要过滤汇总值,请使用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

答案 1 :(得分:1)

内部联接的计数永远不会少于1.也许左联接和IS NULL会有所帮助。那,或者改为使用SUM()

答案 2 :(得分:1)

虽然APC的答案在语法上是正确的,但如果你要解决的问题确实是:“找到所有没有任何news_tags_entries的new_tags”,那么INNER JOINGROUP BY的查询并且HAVING不会产生正确的结果。实际上,它总是会产生空集。

正如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但是从news_tags到news_tags_entries的LEFT JOIN需要在那里,否则你将丢失news_tags_items中没有相应项目的news_tags)

另一个更明确的方法是解决“让我所有的x没有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中被避开

答案 3 :(得分: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'