2008-10-15 4 views
2

У меня есть данные SQL, который выглядит следующийSQL подзапросы

events 
id name   capacity 
1 Cooking  10 
2 Swimming  20 
3 Archery  15 

registrants 
id name 
1 Jimmy 
2 Billy 
3 Sally 

registrant_event 
registrant_id event_id 
    1    3 
    2    3 
    3    2 

Я хотел бы, чтобы выбрать все поля в «события», а также дополнительное поле, которое является числом людей, которые в настоящее время зарегистрировано это событие. В этом случае у Archery было бы 2 регистратора, у Плавания было бы 1, а Cooking - 0.

Я предполагаю, что это может быть выполнено в одном запросе, но я не уверен в правильном синтаксисе. Как будет написан запрос для получения этих данных?

Обновление: Спасибо за отличные ответы, вы все рок!

ответ

9
SELECT e.*, ISNULL(ec.TotalRegistrants, 0) FROM events e LEFT OUTER JOIN 
(
    SELECT event_id, Count(registrant_id) AS TotalRegistrants 
    FROM registrant_event 
    GROUP BY event_id 
) ec ON e.id = ec.event_id 
+0

Я предполагаю, что ты означает e.id вместо e.event_id в последней строке. – Powerlord 2008-10-15 19:40:35

+0

Это используется в среде mysql, поэтому я изменил ISNULL() на IFNULL(), и он отлично работал. Благодаря! http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html – GloryFish 2008-10-15 20:25:38

2
SELECT Events.ID, Events.Name, Events.Capacity, 
     ISNULL(COUNT(Registrant_Event.Registrant_ID), 0) 
FROM Events 
LEFT OUTER JOIN Registrant_Event ON Events.ID = Registrant_Event.Event_ID 
GROUP BY Events.ID, Events.Name, Events.Capacity 
+0

GROUP BY Events.ID, Events.Name, Events.Capacity некорректно – 2008-10-15 19:27:25

+0

Почему это не так верный? – 2008-10-15 19:31:56

+0

Правильный способ использования GROUP BY в этом случае с подзапросом. Помещение всех выбранных полей в GROUP BY является распространенной ошибкой. – 2008-10-15 19:35:54

0
select e.id, e.name, e.capacity, IsNull(re.eventCount,0) from events e 
left join (
select count(event_id) as eventCount, event_id from registrant_event group by event_id 
) re 
on e.id = re.event_id
-1
SELECT 
    events.* 
, COUNT(registrant_event.registrant_id) AS registrantsCount 
FROM events 
LEFT JOIN registrant_event ON events.id = registrant_event.event_id 
GROUP BY events.id 
-1
SELECT e.id, count(*) AS NumRegistrants 
FROM events e 
LEFT JOIN registrant_event re ON re.event_id=e.id 
GROUP BY e.id 

Обратите внимание, что это возвращает 1 вместо 0 для событий, не имеющих регистраторами. Чтобы получить его, чтобы показать 0 вместо этого, вы должны получить немного сложнее:

SELECT *, 
    (SELECT COUNT(*) FROM registrant_event WHERE event_id=id) AS NumRegistrants 
FROM events 
0

Я испытал это в Oracle 11g, и это похоже на работу

SELECT e.id, e.name, e.capacity, COUNT(re.event_id) 
FROM events e 
LEFT JOIN registrant_event re 
    ON e.id = re.event_id 
GROUP BY e.id, e.name, e.capacity 
1
select d.id1, d.name, d.cappacity, count(d.b_id) as number_of_people 
from (select eve.id1,eve.name,eve.cappacity,re_eve.b_id 
    from eve left join re_eve on eve.id1 = re_eve.b_id) d 
group by d.id1, d.name, d.cappacity 
Смежные вопросы