Я работаю над своим первым заданием, используя SQL на нашем сервере PostgreSQL класса. Пример базы данных имеет (здесь частично) схему:
CREATE TABLE users (
id int PRIMARY KEY,
userStatus varchar(100),
userType varchar(100),
userName varchar(100),
email varchar(100),
age int,
street varchar(100),
city varchar(100),
state varchar(100),
zip varchar(100),
CONSTRAINT users_status_fk FOREIGN KEY (userStatus) REFERENCES userStatus(name),
CONSTRAINT users_types_fk FOREIGN KEY (userType) REFERENCES userTypes(name)
);
CREATE TABLE events (
id int primary key,
title varchar(100),
edate date,
etime time,
location varchar(100),
user_id int, -- creator of the event
CONSTRAINT events_user_fk FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE polls (
id int PRIMARY KEY,
question varchar(100),
creationDate date,
user_id int, --creator of the poll
CONSTRAINT polls_user_fk FOREIGN KEY (user_id) REFERENCES users(id)
);
и набор образцов данных (в частности, 127 пользователей выборки).
Мне нужно написать запрос, чтобы узнать количество опросов, созданных пользователем за последний год, а также количество событий, созданных пользователем за последний год. Хитрость в том, что у меня должны быть строки с 0 для обоих столбцов, если у пользователя не было таких опросов / событий.
У меня есть запрос, который, похоже, возвращает правильные данные, но только для 116 из 127 пользователей, и я не могу понять, почему запрос обрезает этих 11 пользователей, когда предложение WHERE проверяет только атрибуты опроса / события. Следующий мой запрос:
SELECT u.id, u.userStatus, u.userType, u.email, -- Return user details
COUNT(DISTINCT e.id) AS NumEvents, -- Count number of events
COUNT(DISTINCT p.id) AS NumPolls -- Count number of polls
FROM (users AS u LEFT JOIN events AS e ON u.id = e.user_id) LEFT JOIN polls AS p ON u.id = p.user_id
WHERE (p.creationDate IS NULL OR ((now() - p.creationDate) < INTERVAL '1' YEAR) OR -- Only get polls created within last year
e.edate IS NULL OR ((now() - e.edate) < INTERVAL '1' YEAR)) -- Only get events that happened during last year
GROUP BY u.id, u.userStatus, u.userType, u.email;
Любая помощь будет высоко ценится.