Я делаю заявление, которое будет возвращать строку данных для отображения входящих сообщений пользователей, просто введя их 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