好的,我知道这听起来很愚蠢。但我已经尝试了一切。
这是我用
开始的代码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.我知道这是因为我将这些行分组在一起。
但我不确定是否有其他方法可以做到这一点。
答案 0 :(得分:0)
它不起作用,因为无论您如何尝试订购集合,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,subkey)。根据您的数据库的大小,您可能需要更多。