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的缩写