Mysql 按子键分组,但如果是新的,则读取,如果不是1,则显示0

Mysql 按子键分组,但如果是新的,则读取,如果不是1,则显示0,mysql,if-statement,group-by,sql-order-by,Mysql,If Statement,Group By,Sql Order By,好吧,我知道这听起来很愚蠢。但我什么都试过了 这是我的代码开始 SELECT toD.username AS ToUser, fromD.username AS FromUser, rvw.* FROM usermessages AS rvw LEFT JOIN users AS toD ON toD.id = rvw.touserid LEFT JOIN users AS fromD ON fromD.id = rvw.fromuserid WHERE touserid = '

好吧,我知道这听起来很愚蠢。但我什么都试过了

这是我的代码开始

SELECT toD.username AS ToUser,
fromD.username AS FromUser, 
rvw.* FROM usermessages AS rvw 

LEFT JOIN users AS toD 
ON toD.id = rvw.touserid 

LEFT JOIN users AS fromD ON fromD.id = rvw.fromuserid 

WHERE touserid = '" . $this->userid . "'
AND deleted = '0' 

GROUP BY subkey 

ORDER BY rvw.read ASC, rvw.created DESC
虽然这确实有效,但我发现,如果有一条新消息,并且读取值为0,它仍然显示为1。我知道这是因为我将行分组在一起


但我不确定是否有其他方法可以做到这一点。

这不起作用,因为mysql可以返回组中的任何行,无论您如何尝试订购集合。要使用某种自定义顺序查找组中的第一行,必须将其分为两个任务—首先查找分组依据的列的所有不同值,然后在子查询中查找每个引用值的第一行。因此,您的查询应该如下所示:

SELECT toD.username AS ToUser, fromD.username as FromUser, msg.* FROM 
       ( SELECT DISTINCT touserid, subkey
       FROM usermessages
       WHERE touserid = 'insert_your_id_here'
       AND deleted=0 ) msgg
JOIN usermessages msg
ON msg.id = ( SELECT msgu.id
              FROM usermessages msgu
              WHERE msgu.touserid = msgg.touserid
              AND msgu.subkey = msgg.subkey
              AND deleted=0
              ORDER BY msgu.read ASC, msgu.created DESC
              LIMIT 1 )
JOIN users fromD ON msg.fromuserid = fromD.id
JOIN users toD ON msg.touserid = toD.id

确保在(touserid,子键)上有索引。根据数据库的大小,您可能需要更多信息。

将其想象为您的iPhone短信,它允许我们像聊天屏幕一样显示信息。帮助我们让用户跟随conversationsubkey是subjectkey的缩写