2013-09-01 62 views
2

我有一個SUM(value)計算每個idea的投票,但是這受到每個想法可以具有的數量tag的影響。MySQL組通過影響其他組

例如,

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

每隔DBMS會拒絕這種說法。閱讀http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html和http://www.mysqlperformanceblog.com/2006/09/06/wrong-group-by-makes -your-queries-fragile /瞭解你的'group by'用法有什麼問題。 –

回答

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 

希望這有助於

+0

謝謝!使用子查詢得到它='' – ahren

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 | 
+0

可能是'* t2.cnt'不是你想要的地方:) –

+0

你的投票仍然乘以標籤的數量。例如,在你的'idea.id = 3'中,你只有一個'-1'投票,但是數據顯示'-16' – ahren

+0

可能是我的測試數據或者你的邏輯的另一部分,但是看看這個[SQLFIDDLE](http://www.sqlfiddle.com/#!2/e02df1/16/0),你會看到'* t2.cnt'包含正確數量的標籤。因此,只需添加'LEFT JOIN(SELECT idea_id,COUNT(*)AS cnt FROM tags_rel GROUP BY tags_rel.idea_id)t2 ON ideas.id = t2.idea_id'並在需要的地方添加* t2.cnt'在你自己的代碼 –