2017-01-24 3 views
0

Если у меня есть таблицыMySQL Группировка два различных размерами

`account`, `account_contact`, `contact_event` and `event` 

И следующий FK-х существует

`account_contact`: `account_id`,`contact_id` 
`contact_event`: `contact_id`, `event_id` 

Как запросить частоту посещаемости для счетов «общих билетов» всех контакты, связанные с учетной записью и событием, и отчетливое количество событий, на которых присутствовали контакты учетной записи.

У меня есть следующее, однако JOIN заставляет первый подзапрос возвращать повторяющиеся строки Ticket's Sold с одинаковыми значениями.

SELECT a1.id,`Tickets Sold`, a2.`Distinct Events Attended` FROM 

(SELECT a.id, count(*) `Tickets Sold` 
FROM account a JOIN account_contact ac 
    ON ac.active = 1 AND a.id=ac.account_id 
JOIN contact_event ce 
    ON ac.contact_id=ce.contact_id 
JOIN event e 
    ON ce.event_id=e.id AND ce.role = 'Checked In' 
WHERE e.date_start >= '2015-12-31' AND e.date_end < '2017-01-01' 
GROUP BY a.id) a1 

LEFT JOIN 

(SELECT a.id,count(*) `Distinct Events Attended` 
FROM account a 
JOIN account_contact ac 
    ON a.id=ac.account_id AND ac.active = 1 
JOIN contact_event ce 
    ON ac.contact_id=ce.contact_id AND ce.role = 'Checked In' 
JOIN event e 
    ON ce.event_id=e.id 
WHERE e.date_start >= '2015-12-31' AND e.date_end < '2017-01-01'  
GROUP BY ac.id) a2 

ON a1.id=a2.id 

Результат показывает проблему: Как вы можете видеть отдельные события, возвращается количество билетов, проданных компанией для этого конкретного случая, поэтому в данном примере было 8 событий присутствовали,

AccountId Tickets DistinctEvents 
38110518 15  5 
38110518 15  1 
38110518 15  3 
38110518 15  2 
38110518 15  1 
38110518 15  1 
38110518 15  1 
38110518 15  1 

Вместо этого я должен вернуться:

AccountID Tickets DistinctEvents 
38110518 15   8 

EDIT: Пример данных

SELECT id,name FROM account; 
id name 
100 Big Company 


SELECT id,first_name FROM contact; 
id first_name 
200 John 
800 Other 


SELECT contact_id,event_id FROM contact_event; 
contact_id event_id 
200 300 
200 500 
800 300 


SELECT account_id,contact_id FROM account_contact; 
account_id contact_id 
100 200 
100 800 


SELECT id,name FROM event; 
id name 
300 Big Event 
500 Small Event 

Если вернуться:

AccountID Tickets DistinctEvents 
100   3   2 
+0

Пожалуйста, пост выборки входных данных и ожидаемых результатов на его основе в вопросе – GurV

+0

Просто измените второй на последней строке в группе a.id вместо ac.id. См. Мой ответ. – AgapwIesu

+0

Я отправлю некоторые данные за несколько минут. Просто задумался. – Alasdair

ответ

1

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

select 
    a.account_id, 
    count(event_id) tickets, 
    count(distinct event_id) distinct_events 
from account_contact a 
inner join contact_event e 
on a.contact_id = e.contact_id 
group by a.account_id; 
+0

Не могу поверить, что это так просто - мне нужно узнать больше о разных модификаторах и группировках. спасибо – Alasdair

Смежные вопросы