У меня есть две таблицы - cpm (cc, ad_id и cpm) и clicks (cc и ad_id).

Когда я бегу:

   SELECT cpm.ad_id, 
          COUNT(clicks.id) * cpm.cpm AS clicks_income     
     FROM cpm 
LEFT JOIN clicks on clicks.ad_id = cpm.ad_id and clicks.cc = cpm.cc
 GROUP BY cpm.ad_id, cpm.cc

Я получил:

ad_id | clicks_income
---------------------
1     | 271.00
1     | 2.60
2     | 238.00

Теперь результат, который я хочу:

ad_id | clicks_income
---------------------
1     | 273.60
2     | 238.00

Как я могу группировать только по cpm. ad_id и имея СУММ всех cc?

Когда я удаляю cpm. cc, я получаю:

ad_id | clicks_income
---------------------
1     | 273.00
2     | 238.00
0
ygaradon 22 Май 2011 в 19:58
1
Разве вы не хотите группировать по ad_id, а не cc?
 – 
CL22
22 Май 2011 в 20:03

2 ответа

Лучший ответ

Не используйте COUNT(whatever) * acolumn, используйте вместо него SUM(AColumn).
Также LEFT JOIN здесь не имеет смысла, потому что несоответствие просто добавит NULL к сумме, что не очень помогает.

SELECT cpm.ad_id, SUM(cpm.cpm) AS clicks_income 
FROM cpm INNER JOIN clicks ON clicks.ad_id = cpm.ad_id AND clicks.cc = cpm.cc
GROUP BY cpm.ad_id
1
Johan 22 Май 2011 в 20:22
Garti, я сделал ту же ошибку при запуске с MySQL, и мне потребовалась целая вечность на отладку.
 – 
Johan
22 Май 2011 в 20:27
Вы знаете, немного поиграв с этим запросом, я обнаружил, что СУММ (cpm.cpm) - это то, что делает разницу. но я не могу понять логику. Я имею в виду, как mysql узнал, что я имел в виду суммировать все количество кликов по сравнению с cpm. Подскажите, пожалуйста, хорошую статью по этой теме. и спасибо еще раз.
 – 
ygaradon
22 Май 2011 в 20:59
@yonathan, попробуйте запрос с группой и без нее и посмотрите, сможете ли вы определить, как это работает
 – 
Johan
22 Май 2011 в 21:18
Также обратите внимание на те двойные строки, которые вы получили в первом запросе в вопросе, которые были добавлены в вычислениях, а также дали неправильный результат.
 – 
Johan
22 Май 2011 в 21:24
Хорошо, я думаю, что понял. Благодарю. но мне нужно больше практики
 – 
ygaradon
22 Май 2011 в 22:10
SELECT cpm.ad_id, COUNT(clicks.id)*cpm.cpm AS clicks_income 
FROM cpm LEFT JOIN clicks ON clicks.ad_id = cpm.ad_id AND clicks.cc = cpm.cc
GROUP BY cpm.ad_id
0
Johan 22 Май 2011 в 20:15
@yonathan: Пожалуйста, пишите комментарии, а не добавляйте отзывы в чей-то ответ путем редактирования.
 – 
Lightness Races in Orbit
22 Май 2011 в 20:12
Когда я удаляю группу с помощью cc, clicks_income неверен, см. мое изменение ^
 – 
ygaradon
22 Май 2011 в 20:18