2012-04-17 5 views
0

У меня есть 3 таблицы. Один для пользователей, один для сообщений и таблица соединений, связывающая две другие таблицы.MySQL JOIN - Complicated Select Statement

Вот несколько примеров данных из таблицы соединений.

| id | user_id | post_id | timestamp | 
|----|---------|---------|-----------| 
| 1 | 1 | 1 | 4-17-2012 | 
| 2 | 1 | 2 | 4-16-2012 | 
| 4 | 2 | 2 | 4-17-2012 | 
| 5 | 3 | 1 | 4-16-2012 | 
|____|_________|_________|___________| 

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

1) Выбрать все сообщения для пользователя с временной меткой 4-17-2012

И

2) Если в таблице соединений для этого пользователя нет записи в столбце, выберите эти сообщения.

Итак ... Для user_id = 1, пост 1 будет выбран, но не пост 2, потому что после 2 не 4-17-2012 Для user_id = 2, обе должности будут выбраны, потому сообщению 1 нет записи для user_id = 2 и post_id = 1 и post 2, потому что это 4-17-2012 Для user_id = 3 сообщение 1 не будет возвращено, но сообщение 2 будет, потому что нет записи для user_id = 3 и post_id = 2.

Вот пример того, что я пытался:

SELECT * FROM сообщений AS р LEFT JOIN posts_users как пу ON (p.post_id = pu.post_id) WHERE ((pu.user_id = $ user_id AND pu.timestamp = 4-17-2012) ИЛИ (pu.post_id IS NULL)

Если в сообщениях было post_id = 3 строки, тогда у него будет NULL для все столбцы posts_users из-за LEFT JOIN, что помогает удовлетворить # 2. Но если есть кто-нибудь вообще с записью posts_users для post_id = 3, тогда не будет NULL. Есть ли способ в MySQL, что мы можем иметь логику для # 2?

Я делаю это все в рамках, которые уже были написаны на PHP, и таким образом, чтобы мне было очень сложно иметь дело с использованием PHP для фильтрации возвращаемых результатов. Доверься мне в этом. Есть ли способ использовать SQL-запрос для выполнения этого, или я должен попытаться сделать обходной путь в PHP после получения результатов какого-либо другого запроса?

Спасибо.

+0

прогностического в этом, похоже, я мог использовать НЕ СУЩЕСТВУЮЩИЕ? Я никогда не использовал это раньше, как бы я использовал его в этом контексте? Еще раз спасибо. – MattDiamant

ответ

1

Будет ли это работать?

выберите * слева пользователя внешнего соединения posts_users на user.id = posts_users.user_id левое внешнее соединение сообщения на posts.id = posts_users.post_id где метка = '4-17-2012' или временная метка = NULL

+0

Точный оператор не работает (например, у него нет user_id), но это привело меня к ответу, поэтому я дам вам галочку. Утверждение, которое я использовал (в основном) следующее (на самом деле это не имена таблиц или столбцов, я просто упрощаю их). Это ужасно. Пусть Бог помилует мою душу. 'SELECT posts. * FROM users LEFT JOIN posts on (1) LEFT JOIN posts_users ON ((posts.id = posts_users.post_id) И (users.id = posts_users.user_id)) WHERE (users.id = $ user_id) AND ((posts_users.timestamp = '4-17-2012') ИЛИ (posts_users.timestamp IS NULL)) ' – MattDiamant