Хитрый MySQL присоединиться - PullRequest
0 голосов
/ 23 января 2012

Я немного застрял с SQL-запросом.Я искал везде, но безрезультатно, поэтому надеялся, что кто-то здесь может помочь.

У меня есть 2 таблицы.

Таблица 1 представляет собой список уведомлений со следующими столбцами

  • notification_id (это автоинкрементный первичный ключ)
  • notification (это сообщение уведомления)
  • from_id (это user_id отправляющего лицауведомление)

например.

|  notification_id  |  notification  |  from_id  |
|       25          |  this message  |    7      |
|       26          |  that message  |    8      |

В таблице 2 показано, какие пользователи прочитали каждое уведомление.Он имеет следующие столбцы

  • notification_id (это идентификатор соответствующего уведомления)
  • user_id (Это идентификатор пользователя, прочитавшего уведомление)

например.

| notification_id   |   user_id   |
|     25            |      1      |
|     25            |      2      |
|     25            |      3      |
|     26            |      2      |

Таблицы объединяются в notification_id, и у нас есть отношение один ко многим, так как многие пользователи будут читать каждое уведомление.

Я пытаюсь сделать запрос к базе данных, чтобы вернуть все уведомления, которые конкретный пользователь еще не прочитал.Другими словами, я хочу получить данные из первой таблицы, но только если в таблице 2 нет записи, где user_id (My user_id x) для соответствующего notification_id.

Так что, если мой user_id4, тогда я получаю данные как для notification_id 25, так и для 26, так как user_id 4 не указан в таблице 2 ни для одного из этих

Если мой user_id равен 2, я не получаю никаких данныхкак user_id 2 указано в таблице 2 как прочитав оба notification_id 25 и 26

Если мой user_id равен 1, я получаю данные для notification_id 26, но не 25

Я изначально думал, что смогу использовать это

SELECT
    notification_id, notification, from_id 
FROM table_1 
INNER JOIN table 2 
    ON table_1.notification_id = table2.notification_id
WHERE table2.user_id != X

Но на самом деле это очень далеко от того, что мне нужно, и я зашел в тупик.

Спасибо

Ответы [ 3 ]

2 голосов
/ 23 января 2012

Я бы сделал левое соединение и поищу пустые соединения.

SELECT notification_id, notification, from_id FROM table_1
LEFT JOIN table_2 ON table_2.notification_id = table_1.notification_id AND table_2.user_id = x
WHERE table_2.notification_id IS NULL
0 голосов
/ 23 января 2012

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

SELECT
    notification_id, notification, from_id 
FROM table_1 
WHERE notification_id not in 
     (SELECT notification_id
      FROM  table 2   
      WHERE table2.user_id == X)
0 голосов
/ 23 января 2012
SELECT
    notification_id, notification, from_id 
FROM table_1 
WHERE 
    notification_id NOT IN (SELECT notification_id from table_2 WHERE user_id = X)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...