2

我有对话和消息。目标是选择对话框及其未读消息的计数。表消息具有unread检测它的字段。

我试过这个

SELECT *, count(unread) as nums 
FROM dialogs JOIN messages ON dialogs.id=messages.dialog_id  
GROUP BY dialogs.id 
HAVING count(unread) <> 0

但总是得到消息的总数

4

3 回答 3

1

哦!!!按messages.id 计数。试试这个:

SELECT *, count(messages.id) as nums FROM dialogs  
      JOIN messages ON dialogs.id=messages.dialog_id  
      WHERE messages.unread = 1 
      GROUP BY dialogs.id 
      HAVING nums <> 0

messages.unread 的 Enum 类型可能需要引用:

SELECT *, count(messages.id) as nums FROM dialogs  
      JOIN messages ON dialogs.id=messages.dialog_id  
      WHERE messages.unread = '1' 
      GROUP BY dialogs.id 
      HAVING nums <> 0

我不确定你为什么要创建一个 enum('0','1') ......

于 2012-10-26T19:29:42.277 回答
1

如果您说该表messages有一列unread,那么我不明白您为什么要计算该列,您可能需要对这些值求和(假设该表上可能有多个相同的记录dialog_id)。所以,我会这样写你的查询:

SELECT *
FROM dialogs D
INNER JOIN (SELECT dialog_id, COUNT(*) AS nums
            FROM messages
            WHERE unread = 1
            GROUP BY dialog_id) M
ON D.id = M.dialog_id  
WHERE M.nums > 0
于 2012-10-26T19:31:02.167 回答
1

如果如您所说,“未读”是未读消息的计数,那么它总是有一个值,即使为零,并且总是包含在 COUNT(unread) 中。

尝试插入一个WHERE messages.unread != 0

于 2012-10-26T19:35:00.157 回答