2
article_vote table
+------------+------+
| article_id | vote |
+------------+------+
|          1 |    3 |
|          1 |    1 |
|          1 |   -1 |
|          1 |   -2 |
+------------+------+

MySQL 5.5 では、上記の表から 2 つの結果を返そうとしています。1. すべての反対票の合計値。2. すべての賛成票の合計値。したがって、正は4、負は-3にする必要があります。投票フィールドに NULL 値はありません。

この SQL は意図したとおりに機能しません。

SELECT vote,
    SUM(vote > 0) AS positive,
    SUM(vote < 1) AS negative
FROM article_vote
WHERE vote_article_id = 50
GROUP BY vote

上記のデータセットで使用すると、次のように返されます。

Array ( [vote] => -22 [positive] => 0 [negative] => 1 ) 

どこが間違っていますか?

4

4 に答える 4

3

これを試してください:

SELECT
    SUM(if(vote > 0, vote, 0)) positive,
    SUM(if(vote < 0, vote, 0)) negative
FROM article_vote
WHERE article_id = 1

結果:

| POSITIVE | NEGATIVE |
|----------|----------|
|        4 |       -3 |

ここでフィドル。

于 2013-10-27T04:33:40.347 に答える
2
mysql> SELECT * FROM article_vote;
+------------+------+
| article_id | vote |
+------------+------+
|          1 |    3 |
|          1 |    1 |
|          1 |   -1 |
|          1 |   -2 |
+------------+------+
4 rows in set (0.00 sec)

SELECT 
    SUM(CASE WHEN vote > 0 THEN vote ELSE 0 END) AS positive,
    SUM(CASE WHEN vote < 0 THEN vote ELSE 0 END) AS negative
FROM article_vote
WHERE article_id = 1;

+----------+----------+
| positive | negative |
+----------+----------+
|        4 |       -3 |
+----------+----------+

http://sqlfiddle.com/#!2/c18e3/1

于 2013-10-27T04:32:44.700 に答える
2

次のように修正します。

select article_id, 
  sum(case when vote >0 then vote else 0 end) as postive,
  sum(case when vote <0 then vote else 0 end) as negative
FROM article_vote
GROUP BY article_id

あなたの場所の状態については不明です、申し訳ありません。

于 2013-10-27T04:34:31.320 に答える
1

次のようなことを試すことができます:

SELECT article_id,

    (SELECT SUM(vote) 
     FROM article_vote 
     WHERE vote > 0 
     AND article_id = 50) AS positive,

    (SELECT SUM(vote)
     FROM article_vote
     WHERE vote < 0
     AND article_id = 50) AS negative

FROM article_vote
WHERE article_id = 50
GROUP BY article_id
于 2013-10-27T04:25:11.130 に答える