MySQL组通过影响其他组

时间:2013-09-01 04:42:49

标签: mysql

我有一个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

的数量

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果您不希望SUMtags影响,则不应 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 |