MySQL - объединить таблицу дважды с основной таблицей - PullRequest
2 голосов
/ 05 мая 2011

Я не уверен, что это можно сделать. Но я просто хотел посоветоваться с экспертами здесь.

Мой случай: У меня есть таблица tbl_campaign, в которой в основном хранятся кампании, имеющие отношение один ко многим с таблицей tbl_campaign_user, где пользователи, выбранные в ходе кампании, хранятся вместе с идентификатором кампании (tbl_campagin_user.cu_campaign_id = tbl_campaign.campaign_id).

Вторая таблица (tbl_campaign_user) имеет поле состояния, равное 0/1, обозначающее неотправленное / отправленное. Я хотел написать один SQL-запрос, который бы считывал данные кампании, а также количество отправленных и неотправленных пользователей кампании (вот почему я дважды присоединяюсь ко второй таблице). Я попробовал это ниже, но я получаю то же количество, что и отправленные и неотправленные.

SELECT `tbl_campaign`.*, 
COUNT(sent.cu_id) as numsent, 
COUNT(unsent.cu_id) as num_unsent   FROM (`tbl_campaign`) 

LEFT JOIN tbl_campaign_user as sent on  (sent.cu_campaign_id = tbl_campaign.campaign_id and sent.cu_status='1')

LEFT JOIN tbl_campaign_user as unsent on  (unsent.cu_campaign_id = tbl_campaign.campaign_id and unsent.cu_status='0')


WHERE `tbl_campaign`.`campaign_id` = '19'  

Я попытался отладить, разбив запрос на две части: =>

SELECT `tbl_campaign`.*, 

COUNT(unsent.cu_id) as num_unsent   FROM (`tbl_campaign`) 

Left join tbl_campaign_user as unsent on  (unsent.cu_campaign_id = tbl_campaign.campaign_id and unsent.cu_status='0')

WHERE `tbl_campaign`.`campaign_id` = '19'

Вышеуказанное работает именно так, как и хотелось. И то же самое ниже:

=>

SELECT `tbl_campaign`.*, 
COUNT(sent.cu_id) as numsent   FROM (`tbl_campaign`) 

Left join tbl_campaign_user as sent on  (sent.cu_campaign_id = tbl_campaign.campaign_id and sent.cu_status='1')

WHERE `tbl_campaign`.`campaign_id` = '19' 

Я не уверен, что я делал неправильно, объединяя их. Я знаю, я не знаю много о соединениях, так что, возможно, концептуальная ошибка Пожалуйста, кто-нибудь может мне помочь?

Спасибо заранее!

1 Ответ

2 голосов
/ 05 мая 2011

Вам нужно только присоединиться к tbl_campaign_user один раз и посчитать (сумму, что угодно), сколько раз cu_status был ноль / единица.

SELECT `tbl_campaign`.id, 
count(u.id) as num_all_campaign_users
sum(u.cu_status) as num_sentcampaign_users, 
count(u.id) - sum(u.cu_status) as num_unsent_campaign_users   
FROM `tbl_campaign` c 
LEFT JOIN tbl_campaign_user as u on (u.cu_campaign_id = c.campaign_id)
WHERE `tbl_campaign`.`campaign_id` = '19'  
group by `tbl_campaign`.id

Обратите внимание, что это своего рода псевдокод, возможно, вам придется разработатьsum / count в предложении select и в предложении group by.

...