选择与表格不同并按日期排序

时间:2016-03-13 06:44:06

标签: php mysql

我正在尝试构建消息传递系统,我想从表中选择不同的值并按日期排序,并返回读取和未读状态。我的表格结构为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

2 个答案:

答案 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

UPDATED SQL FIDDLE

示例输入:

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