因此,我想将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的数量来过滤结果。
有意义吗?
提前致谢。
答案 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 JOIN
和GROUP 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 BY
和HAVING
,而不只是想找到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'