我必须创建一个页面,我必须列出向我发送消息的所有用户或我发送消息的用户。所以,我也可以是消息的接收者和发送者。此外,消息应该是最新的消息。就像我们在什么应用程序中的列表页面一样。像:
User1
some latest message <
----------------------------
User2
some other latest message >
----------------------------
User3
some latest message <
----------------------------
User4
some latest message <
----------------------------
User5
some latest message >
----------------------------
我有一个用户表,其中包含每个用户的正常详细信息以及包含该消息的消息表。我想知道我可以只用一个查询来完成上面的列表吗?我试过这个问题:
$sql1 = "SELECT * FROM tbl_messages WHERE sender_id=1 OR receiver_id=1 GROUP BY sender_id, receiver_id ORDER BY message_timestamp DESC";
但是这个SQL返回记录组,如:
在这里你可以看到我有两个用户ID 1和2的组,但理想情况下我应该只有一个用户ID组合1和2的记录。而且它们不是最新的消息。他们返回最老的一个。因此,只需交换,发送或接收带有消息的用户列表。
任何人都可以让我知道我在SQL中缺少什么使它工作?任何帮助将受到高度赞赏。
答案 0 :(得分:1)
原则上你应该在嵌套子查询中使用联合,它不是out_of_the_box查询:
SELECT
m.message,
m.message_timestamp,
IF(s.user_id = 1, r.user_name, s.user_name) talk_to,
IF(s.user_id = 1, 'out', 'in') in_out
FROM
(SELECT
me,
other,
MAX(message_id) max_id
FROM
(SELECT
sender_id me,
receiver_id other,
message_id
FROM
messages
WHERE sender_id = 1
UNION ALL
SELECT
receiver_id me,
sender_id other,
message_id
FROM
messages
WHERE receiver_id = 1
) mu
GROUP BY me,other
) lm
JOIN
messages m
ON lm.max_id = m.message_id
JOIN
users s
ON m.sender_id = s.user_id
JOIN
users r
ON m.sender_id = r.user_id