Оператор MySQL, который возвращает входящие сообщения пользователей - ВЫБЕРИТЕ разговор, пользователя, имя, последнее сообщение ИЗ 3 таблиц - PullRequest
0 голосов
/ 19 ноября 2018

Я делаю заявление, которое будет возвращать строку данных для отображения входящих сообщений пользователей, просто введя их user_id.

У меня есть три таблицы: пользователи, разговоры и сообщения.Я пытаюсь создать оператор SQL, который будет возвращать conv_id, user_id, имя (из таблицы пользователей) и последнее сообщение, отправленное в этом разговоре.Пока что это утверждение, которое я придумал:

SELECT DISTINCT n.conversation AS conv_id, n.user_id, n.name, n.message_body FROM
    (SELECT CONCAT(u.first, " ", u.last) AS name, c.conv_id AS conversation, c.user_id, m.message_body
    FROM users AS u,
      (SELECT conv_id, CASE
        WHEN user1="14" THEN user2
        WHEN user2="14" THEN user1
        END AS user_id FROM conversations) AS c,
      (SELECT DISTINCT x.id, x.message_body, x.conv_id FROM messages AS x,
        (SELECT conv_id AS convs FROM conversations WHERE user1="14" or user2="14") AS y
      WHERE (x.message_from="14" or x.message_to="14") AND x.conv_id=y.convs
      ORDER by x.id DESC) AS m
    WHERE u.user_id=c.user_id) as n
  GROUP BY n.conversation

И на данный момент оно возвращает conversation, user_id и name, которые я ищу, но дает мненеправильно message_body для каждого разговора.

Мои таблицы выглядят так:

пользователи

user_id | first | last
14        John    Smith
15        Steve   Lowe
16        Will    Willis

разговоры

conv_id | user1 | user2
4         14     15
5         15     16
6         16     14

сообщения

id | conv_id | message_to | message_from | message_body
1    4         15           14             alpha
2    4         14           15             beta
3    4         15           14             charlie
4    4         14           15             delta
5    5         16           15             epsilon
6    5         15           16             foxtrot
7    5         16           15             golf
8    5         15           16             hotel
9    6         14           16             india
10   6         16           14             juliette
11   6         14           16             kilo
12   6         16           14             lima

Для user_id = 14 Я хочу, чтобы мое утверждение вернулось:

conv_id | user_id |     name     | message_body
4        15        Steve Lowe     delta
6        16        Will Willis    lima

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

Пожалуйста, помогите!

SQLFiddle: http://sqlfiddle.com/#!9/70359d

1 Ответ

0 голосов
/ 19 ноября 2018

На данный момент это работает для меня

SELECT CONCAT(u.first, " ", u.last) AS name, m.conv_id, c.user_id, m.message_body, m.sent_time
    FROM users AS u, 
    (SELECT conv_id, CASE WHEN user1="14" THEN user2 WHEN user2="14" 
    THEN user1 END AS user_id FROM conversations) AS c, 
    (SELECT MAX(id), conv_id, message_body, sent_time FROM messages 
    WHERE message_to="14" or message_from="14" GROUP BY conv_id ORDER BY 
    sent_time DESC) AS m
WHERE u.user_id=c.user_id AND m.conv_id=c.conv_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...