我有一个SUM(value)
来计算每个idea
的投票数,但这会受到每个想法可以拥有的tag
数量的影响。
例如,
SELECT
id,
title,
description,
COALESCE(SUM(case when value > 0 then value end),0) votes_up,
COALESCE(SUM(case when value < 0 then value end),0) votes_down,
GROUP_CONCAT(DISTINCT tags.name) AS 'tags',
FROM ideas
LEFT JOIN votes ON ideas.id = votes.idea_id
LEFT JOIN tags_rel ON ideas.id = tags_rel.idea_id
LEFT JOIN tags ON tags_rel.tag_id = tags.id
GROUP BY ideas.id
因此,如果有多个tags.name
,则SUM()
会乘以tags.name
我该如何解决这个问题?
答案 0 :(得分:1)
如果您不希望SUM
受tags
影响,则不应 tags
进入SUM
查询。
我认为您可以将查询拆分为2部分(查询中的查询)。首先是SUM 没有想法,然后在第一部分
中为结果库加入想法数据有些想要(对不起,但我还没有测试我的查询,但想法就是这样):
SELECT
t.id,
t.title,
t.description,
t.votes_up,
t.votes_down,
GROUP_CONCAT(DISTINCT tags.name) AS 'tags',
FROM
(
SELECT
id,
title,
description,
COALESCE(SUM(case when value > 0 then value end),0) votes_up,
COALESCE(SUM(case when value < 0 then value end),0) votes_down,
FROM ideas
LEFT JOIN votes ON ideas.id = votes.idea_id
GROUP BY ideas.id
) as t
LEFT JOIN tags_rel ON t.id = tags_rel.idea_id
LEFT JOIN tags ON tags_rel.tag_id = tags.id
希望这个帮助
答案 1 :(得分:1)
SELECT
ideas.id,
title,
description,
COALESCE(SUM(case when value > 0 then value end),0)*t2.cnt votes_up,
COALESCE(SUM(case when value < 0 then value end),0)*t2.cnt votes_down,
GROUP_CONCAT(DISTINCT tags.name) AS 'tags'
FROM ideas
LEFT JOIN votes ON ideas.id = votes.idea_id
LEFT JOIN tags_rel ON ideas.id = tags_rel.idea_id
LEFT JOIN tags ON tags_rel.tag_id = tags.id
LEFT JOIN (SELECT idea_id, COUNT(*) AS cnt
FROM tags_rel
GROUP BY tags_rel.idea_id) t2 ON ideas.id = t2.idea_id
GROUP BY ideas.id
请参阅SQLFIDDLE
编辑:
结果中包含标签计数列:
<强> Results 强>:
| ID | TITLE | DESCRIPTION | VOTES_UP | VOTES_DOWN | TAGS | TAGS_COUNT |
|----|--------|-------------|----------|------------|-------------------------|------------|
| 1 | TITLE1 | DESC1 | 12 | -4 | tags1,tags2 | 2 |
| 2 | TITLE2 | DESC2 | 18 | 0 | tags4,tags5,tags3 | 3 |
| 3 | TITLE3 | DESC3 | 0 | -16 | tags9,tags7,tags8,tags6 | 4 |
| 4 | TITLE4 | DESC4 | 1 | 0 | tags10 | 1 |