【问题标题】:Select distinct from the table and sort by date从表中选择不同并按日期排序
【发布时间】:2016-03-13 17:10:13
【问题描述】:

我正在尝试构建消息传递系统,我想从表中选择不同的值并按日期排序并返回已读和未读状态。我的表结构为 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 并按日期排序,以便我可以在列表顶部显示最近聊天的用户的姓名,如果有@987654324 的任何行,还返回读取状态1 @已经读取状态0,那么我想将read返回为0,这样我就可以区分谁的用户消息有未读消息。

假设from_user_id 在一行中有read 状态为0,那么当返回from_user_id 的不同值时,我想将read 状态返回为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

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    尝试以下查询:

    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
    

    注意:如果您的message 表中存在多个具有相同datetime 和相同to_user_id 的条目,则此查询可能会为您提供相同from_user_id 的多行。

    【讨论】:

    • 请检查更新的 sql fiddle。我也修改了查询。请检查此更新。 @user254153
    • 你的意思是如果to_user_iddatetime对于两行是相同的,它可能会返回多个from_user_id。但是,怎么解决。我只想选择不同的。
    • 实际上这种情况不会出现,除非您在多行中有having the same from_user_id,datetime and to_user_id 这样的无效数据状态。你的情况有可能吗?@user254153
    • 这可能是非常罕见的情况。但如果我让我的日期时间字段非常独特,我可以解决这个问题。假设如果用户使用 ajax 同时发送两条消息,那么如果使用相同的日期时间插入,则日期时间可能会重复。我可以确保 datetime 非常独特。所以即使用户同时发送两条消息,如果已经有相同的日期时间,我可以在秒内增加吗?
    • 不,你误解了我的意思。如果单个用户不小心向同一收件人发送了两次或多次相同的消息。其实这种情况不会出现,除非出现意外情况。请不要为此烦恼。我这样说是为了显示我的查询行为。只是忽略它,伙计! @user254153
    【解决方案2】:

    签出此查询:

    SELECT DISTINCT(form_user_id),MIN(read) FROM table_name ORDER BY datetime ASC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      相关资源
      最近更新 更多