【发布时间】:2014-04-10 21:09:14
【问题描述】:
我正在开发一个聊天系统,会话列表必须显示 2 件事:
- 发送消息的人(我又名当前用户或其他用户)的最后一条消息
- 其他用户的姓名
我遇到问题的部分是第二点。当前查询显示每个对话的最后一条消息,但在我(当前用户)发送最后一条消息的情况下,应该显示其他用户的名称而不是我的姓名。
SELECT SQL_CALC_FOUND_ROWS
u.id_user AS id,
i.id_user_from,
i.id_user_to,
u.name AS name,
UNIX_TIMESTAMP(i.date_msg) AS date_msg,
i.message AS msg
FROM inbox AS i
INNER JOIN user AS u ON (u.id_user = i.id_user_from OR u.id_user = i.id_user_to)
WHERE id_msg IN
(SELECT MAX(id_msg) AS id FROM
(
SELECT id_msg, id_user_from AS id_with
FROM inbox
WHERE id_user_to = 1
UNION ALL
SELECT id_msg, id_user_to AS id_with
FROM inbox
WHERE id_user_from = 1) AS t
GROUP BY id_with
)
ORDER BY i.id_msg DESC
在本例中,我是 Andufo (id_user = 1)。如果有帮助,这里是sqlfiddle link。谢谢!
【问题讨论】:
-
为了所有回答者的利益,您是否愿意出于性能/简单性的原因更改您的数据库结构,或者您只想根据您当前的结构获得答案?不是说它需要它,但其他人可能!
-
SQL Fiddle 链接似乎不起作用,您可以使用表结构、示例数据和所需结果编辑您的问题吗?
-
你想要来自用户的名字还是给用户的名字?
-
@halfer 是的,我愿意更改某些结构,唯一的规则是始终有一个单独的消息表和一个单独的用户表。
-
@AjayPatel 始终是“收件人”名称。它与 iMessage、Whatsapp、LINE 等收件箱非常相似。