2013-12-12 3 views
0

Мне нужно собрать все сообщения, созданные одним пользователем и получить количество людей, которые присоединились к ним.MySQL get count of items using RIGHT JOIN

Я попробовал этот запрос:

SELECT ads.id, ads.title, sign_ups.user_id 
FROM sign_ups RIGHT JOIN ads ON ads.id = sign_ups.ad_id 
WHERE advertiser_id=1 

И выход:

id  title     user_id 
1  Something     1 
2  something else    2 
3  another title    NULL 
1  Something     2 

Но я хочу:

id  title    total 
1  Something    2 
2  something else   1 
3  another title   0 

Но я хочу:

id  title    total 
1  Something    2 
2  something else   1 
3  another title   0 

Так что я попытался это:

SELECT ads.id, ads.title, count(sign_ups.user_id) AS total 
FROM sign_ups 
RIGHT JOIN ads ON ads.id = sign_ups.ad_id 
WHERE advertiser_id =1 

Но выход не включает в себя все title поля, которые не следуют ни пользователю. Результат выглядит примерно так:

id  title     total 
1  Something     2 
2  something else   1 

Хотите спросить, как изменить мой запрос, чтобы получить все нужные записи.

Спасибо!

+0

'IFNULL' и' GROUP BY' возможно? – Kermit

ответ

1

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

SELECT ads.id, ads.title, count(sign_ups.user_id) AS total 
FROM sign_ups 
RIGHT JOIN ads ON ads.id = sign_ups.ad_id 
WHERE advertiser_id=1 AND sign_ups.user_id IS NOT NULL 
UNION ALL 
SELECT ads.id, ads.title, 0 AS total 
FROM sign_ups 
RIGHT JOIN ads ON ads.id = sign_ups.ad_id 
WHERE advertiser_id=1 AND sign_ups.user_id IS NULL 
+0

Работает отлично :) – user2929533

0

Попробуйте использовать «ifnull», чтобы убедиться, что даже те, у которых нет идентификаторов пользователей, должны отображаться. Я не уверен, что это именно то, что вы хотите, но я был бы рад помочь.

SELECT ads.id, ads.title, ifnull(count(sign_ups.user_id), 0) AS total 
FROM sign_ups 
RIGHT JOIN ads ON ads.id = sign_ups.ad_id 
WHERE advertiser_id =1 

Вот статья о IFNULL(): http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_ifnull

+0

Это работает так же, как и мое. – user2929533