SQL множественное объединение с подсчетом, возникли проблемы - PullRequest
1 голос
/ 14 октября 2010

Прежде всего, это домашнее задание, поэтому я ищу помощь, а не решения.Позвольте мне попытаться объяснить мою схему.У меня есть три таблицы, которые мы будем называть пользователями (с идентификаторами и именами столбцов), сторонами (с идентификаторами столбцов, partydate и user_id) и вопросами (с идентификаторами столбцов, createate и user_id).Мое требование - показать каждому пользователю количество сторон за последний год и вопросы, созданные за последний год.Сначала у меня было что-то вроде этого:

SELECT users.id, users.name,  
COUNT(parties.id) AS numparties, COUNT(qustions.id) AS numquestions
FROM users
FULL JOIN parties ON users.id=parties.user_id
FULL JOIN questions ON users.id=questions.user_id
WHERE (parties.partydate > NOW() - interval '1 year' OR parties.partydate IS NULL)
OR (questions.createdate > NOW() - interval '1 year' OR questions.createdate IS NULL)
GROUP BY users.id, users.name

Теперь это работает, почти!Проблема в том, что если у пользователя нет ни сторон, ни вопросов в течение прошлого года, они вообще не отображаются в результате.Я хочу, чтобы такой пользователь появлялся, я просто хочу, чтобы он показывал им 0 для каждого числа и числа.

Мне кажется, что здесь нужен какой-то условный подсчет, в котором я хочу только СЧИТАТЬ (party.id) ГДЕ вечеринка этой партии в течение прошлого года, и то же самое для вопросов.Я просто не уверен, как это сделать.У меня есть хакерский способ обхода, который я хочу сделать, где я в основном ОБЪЕДИНЯЮ вышеупомянутый запрос с почти идентичной копией самого себя, за исключением того, что я использую SUM (0) для числа и числа, а мой оператор WHERE именно там, где дата <= вместо>.Я чувствую, что это не лучший способ сделать это.

Есть ли указатели в правильном направлении?Спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 14 октября 2010

Взгляните на это: http://www.w3schools.com/sql/sql_join_left.asp. Я думаю, что это может указать вам правильное направление.

0 голосов
/ 14 октября 2010

Я думаю, что я прибегну к подзапросу для этого. На домашние вопросы интересно отвечать, я могу сильно зашифровать это. Возьмите весь ваш запрос и назовите его «x».

Первое, что вам нужно, это список всех пользователей, независимо от того, сколько вопросов они задали.

Select distinct users.id,users.name from users

, который даст вам полный список ваших пользователей. Вышеупомянутый запрос дает вам звонки ... так что оставьте их вместе.

Select (fields you want)
from users
left join (enter you query above here) x on x.id = users.id

Надеюсь, логика здесь имеет смысл для вас. Используйте один запрос, чтобы получить список пользователей, и присоедините его к подзапросу, чтобы узнать их количество.

изменить, чтобы добавить: это вернет нули в любое время, когда нет записей. Вы можете сделать так, чтобы ваш оператор выбора показывал нули как 0 *

0 голосов
/ 14 октября 2010

Думаю, у меня это есть:

SUM(CASE WHEN (parties.partydate > NOW() - interval '1 year') THEN 1 ELSE 0 END) as numparties

и только что удалил предложения WHERE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...