SQL-запрос с 2 группировкой - PullRequest
0 голосов
/ 13 сентября 2009

Это запрос, который выполняется без проблем с MySql 5.0.51:

SELECT cc_split.idSplit,
       count( voteup.vote),
       count( votedown.vote)
FROM cc_split
LEFT JOIN cc_split_usager AS voteup ON voteup.idSplit = cc_split.idSplit
      AND voteup.vote >0
LEFT JOIN cc_split_usager AS votedown ON votedown.idSplit = cc_split.idSplit
      AND votedown.vote <0
WHERE cc_split.isArchived = false
GROUP BY cc_split.idSplit
LIMIT 0, 30

Проблема в том, что COUNT не отображает то, что я хотел бы иметь. Если вы видите, это берет cc_ split_ usager и должен считать количество голосов, которое является положительным, а с другой стороны, считать количество голосов, которое является отрицательным. Приведенный выше код отображает число повышений 2 и понижения 2, тогда как на самом деле должно быть 2 повышения и 1 снижение. Какой трюк иметь в одном запросе SQL количество upvote и downvote.

Таблицы выглядят так:

cc_split:
-idSplit
-...
cc_split_usager:
-idSplit
-vote (can be +1 or -1)
-...

Любой намек на меня?

Ответы [ 2 ]

1 голос
/ 13 сентября 2009

попробуйте это:

SELECT s.idSplit, 
    Sum( Case When vote > 0 Then 1 Else 0 End) UpVotes,
    Sum( Case When vote < 0 Then 1 Else 0 End) DownVotes
FROM cc_split s       
   LEFT JOIN cc_split_usager v 
      ON v.idSplit = s.idSplit        
WHERE s.isArchived = false        
GROUP BY s.idSplit        
LIMIT 0 , 30
1 голос
/ 13 сентября 2009

Попробуйте:

SELECT s.idSplit, 
    count(case when v.vote > 0 then 1 else null end) as VoteUp, 
    count(case when v.vote < 0 then 1 else null end) as VoteDown 
FROM cc_split s
LEFT JOIN cc_split_usager AS v ON v.idSplit = s.idSplit
WHERE s.isArchived = false
GROUP BY s.idSplit
LIMIT 0, 30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...