2

我有一个SUM(value)计算每个想法的选票idea,但这会受到tag每个想法可以拥有的 s 数量的影响。

例如,

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

我怎样才能解决这个问题?

4

2 回答 2

1

如果您不希望您SUM受到影响tags,则不应包含 tags在您的SUM查询中。

我认为您可以将您的查询分成 2 部分(查询内的查询)。首先在没有想法的情况下求和,然后根据第一部分加入想法数据以获得结果

有些东西想要(抱歉,我还没有测试我的查询,但想法是这样的):

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

希望这有帮助

于 2013-09-01T05:09:26.977 回答
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

编辑 :

结果中包含标签计数列:

结果

| 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 |
于 2013-09-01T05:18:45.103 回答