2

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.nameSUM()は の数で乗算されます。tags.name

どうすればこれを修正できますか?

4

2 に答える 2

1

SUMの影響を受けないようにするには、クエリに含めtagsないでください。 tagsSUM

クエリを 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 に答える