MySQL - я не хочу нескольких записей в соединении - PullRequest
0 голосов
/ 22 мая 2011

Это вопрос SQL, включающий объединение, дающее мне больше, чем я хочу.

У меня есть 2 таблицы, таблица событий и таблица певцов

EVENTS
event_id
event_name
num_attendees
tickets_sold
tickets_promo
event_date
... many other fields
SINGERS
event_id
singer

Япытаюсь получить статистику событий из таблицы событий, если выполняется ЛЮБОЙ из списка исполнителей.

EVENTS:
event_id num_attendees tickets_sold
   1        15              2500
   2         5              1575

Singers at the event:
event_id  singer
   1      bob
   1      jane
   2      bob

Меня интересует статистика событий, в которых пел Боб или Джейн:

SELECT count(e.event_id) as count_events, sum(num_attendees) as sum_attentees, 
       sum(tickets_sold) as sum_tickets_sold
  FROM `events` e
       INNER JOIN singers s ON s.event_id = e.event_id 
   AND s.singer IN ("bob", "jane")
 WHERE event_date ...

Дает мне неправильное количество и суммы, так как объединение даст мне 2 записи для события 1 и 1 запись для события 2, а количество событий будет равно 3.

Как мне написать этот SQL?Спасибо.

Ответы [ 4 ]

3 голосов
/ 22 мая 2011
SELECT count(e.event_id) as count_events,
       sum(num_attendees) as sum_attentees,
       sum(tickets_sold) as sum_tickets_sold 
FROM events e 
WHERE e.event_id IN 
     (SELECT DISTINCT event_id FROM singers WHERE singer IN ("bob", "jane"));
2 голосов
/ 22 мая 2011

Я не думаю, что JOIN действительно подходит здесь.Попробуйте подзапрос, чтобы получить список интересующих вас событий:

SELECT count(e.event_id) as count_events, sum(num_attendees) as sum_attentees,
    sum(tickets_sold) as sum_tickets_sold
    FROM events WHERE event_id IN
        (SELECT DISTINCT event_id FROM singers WHERE singer_id IN ('Bob', 'Jane'))
    AND event_date ...
2 голосов
/ 22 мая 2011
SELECT count(e.event_id) as count_events, 
       sum(num_attendees) as sum_attentees, 
       sum(tickets_sold) as sum_tickets_sold
  FROM `events` e
 WHERE event_date ...
   AND EXISTS (
           SELECT 1 
             FROM singers s 
            WHERE s.event_id = e.event_id 
              AND s.singer IN ("bob", "jane")
              );
0 голосов
/ 22 мая 2011

Я думаю, вы также можете использовать объединение как

 SELECT count(e.event_id) as count_events, 
   sum(e.num_attendees) as sum_attentees, 
   sum(e.tickets_sold) as sum_tickets_sold
 FROM events e join (SELECT DISTINCT event_id FROM singers WHERE singer_id IN ('Bob', 'Jane')) s 
  on e.event_id =  s.event_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...