2013-04-05 6 views
2

У меня есть две таблицы: приглашения и события.Мне нужно сделать подзапрос

Мне нужно получить имя события, общее количество гостей на событие и общее количество подарков, когда оно истинно для каждого события в одном запросе!

Нечто подобное объединять обе таблицы (левое соединение) выбирают events.name, граф (invitations.guest), граф (invitations.presents когда = истина) и группа его событиями ...

Глядя данные таблицы ...

https://dl.dropbox.com/u/360112/Duda/invitaciones.jpg https://dl.dropbox.com/u/360112/Duda/eventos.jpg

Я думаю, что это может работать, но я не понимаю, что я хочу ...

SELECT e.name, count(in.guest) as Guests, (SELECT count(presents) 
FROM watermelon.invitations WHERE presents = true) as Presents 
FROM watermelon.events e LEFT JOIN watermelon.invitations in ON e.id = in.event 
GROUP BY in.event; 

Тогда я получаю:

http://dl.dropbox.com/u/360112/Duda/resultado.jpg

Некоторые предложения? Пожалуйста, мне это нужно, и я устал от попыток и получения неправильных результатов ... Заранее благодарим!

+0

Пожалуйста, форматировать вопрос лучше в следующий раз , :) Также отключена ссылка на вашу папку. – Jess

+1

О! Я буду знать об этом в следующий раз! – Jamr

ответ

2

Похоже, вы хотите что-то подобное с помощью COUNT, GROUP BY и CASE:

SELECT E.Id, 
    E.Name, 
    COUNT(I.Id) TotalGuests, 
    COUNT(CASE WHEN I.Presents = 'TRUE' THEN 1 END) TotalPresents 
FROM Events E 
    LEFT JOIN Invitations I ON E.Id = I.Event 
GROUP BY E.Id, E.Name 

Я не уверен о своем типе данных Presents, но это должно быть близко. Также используйте LEFT JOIN для возврата всех событий.

+0

Спасибо. Он отлично работает! Пожалуйста, не могли бы вы рассказать мне, где я могу найти дополнительную информацию об этих методах и ключевых словах, используемых в запросе? – Jamr

+1

@Jamr - np, рад, что мы могли бы помочь! Операторы CASE работают так же, как IF-операторы - если Presents = 'True', то подсчитывают запись, иначе нет (на самом деле else возвращает null, и если вы пытаетесь считать нуль, она считается 0). Вы можете группировать несколько инструкций WHEN вместе (else if), что делает для хороших сравнений. С наилучшими пожеланиями. – sgeddes

1

Проблема заключается в том, что ваш подзапрос
(SELECT count(presents) FROM watermelon.invitations WHERE presents = true)
не делает никакой фильтрации; это просто подсчет всех записей в таблице с истинным каждый раз, когда он вызывается. Следующий запрос должен сделать это так, как вам нужно. Это точно такой же запрос вы были исключением того, что я добавил «и subq.event = e.id» критерии, которые ограничивают подзапрос к данным только для этой конкретной записи:
SELECT e.name, count(in.guest) as Guests, (SELECT count(subq.presents) FROM watermelon.invitations as subq WHERE subq.presents = true and subq.event=e.id) as Presents FROM watermelon.events e LEFT JOIN watermelon.invitations in ON e.id = in.event GROUP BY in.event;