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

时间:2011-05-07 12:09:59

标签: 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 = '" . $this->userid . "'
AND deleted = '0' 

GROUP BY subkey 

ORDER BY rvw.read ASC, rvw.created DESC

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

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

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)。根据您的数据库的大小,您可能需要更多。