我正在尝试构建消息传递系统,我想从表中选择不同的值并按日期排序,并返回读取和未读状态。我的表格结构为id, from_user_id, to_user_id, message, datetime, read
。假设虚拟数据如下:
id | from_user_id | to_user_id | message | datetime | read
1 | 20 | 50 | hi | 2016-3-13 06:05:30 | 1
2 | 20 | 50 | hey | 2016-3-13 06:15:30 | 0
3 | 30 | 50 | hi | 2016-3-14 06:05:30 | 0
现在我想选择不同的from_user_id
并按日期排序,以便我可以显示最近在列表顶部进行聊天的用户的名称,并且如果有任何行,则还返回读取状态1 from_user_id
读取状态为0,然后我想将read
返回为0,以便区分其用户消息是否为未读消息。
假设from_user_id
在一行中read
状态为0,那么我想在返回read
的不同值时将from_user_id
状态返回为0。我该怎么做。我尝试如下,但在我的情况下不起作用。它返回不同的值,但没有按日期排序,也读取状态,没有返回我期望的值。
select distinct(`from_user_id`),register.name FROM message INNER JOIN register ON register.id = message.from_user_id where message.to_user_id = $user_id GROUP BY message.id ORDER BY MAX(datetime) ASC
答案 0 :(得分:2)
尝试以下查询:
SELECT
message.from_user_id,
register.name,
message.read
FROM message
INNER JOIN
(
SELECT
from_user_id,
MAX(datetime) max_datetime
FROM message
WHERE to_user_id = 50
GROUP BY from_user_id ) t
ON t.from_user_id = message.from_user_id AND t.max_datetime = message.datetime
INNER JOIN register ON register.id = message.from_user_id
WHERE message.to_user_id = 50
ORDER BY message.datetime ASC
示例输入:
id | from_user_id | to_user_id | message | datetime | read
1 | 20 | 50 | hi | 2016-3-13 06:05:30 | 1
2 | 20 | 50 | hey | 2016-3-13 06:15:30 | 0
3 | 30 | 50 | hi | 2016-3-14 06:05:30 | 0
<强>输出:强>
from_user_id name read
20 User20 0
30 User30 0
注意:如果from_user_id
表中有多个条目具有相同的message
并且相同,则此查询可能会为同一个datetime
提供多行to_user_id
。
答案 1 :(得分:0)
结帐此查询:
SELECT DISTINCT(form_user_id),MIN(读取)FROM table_name ORDER BY datetime ASC