我有对话和消息。目标是选择对话框及其未读消息的计数。表消息具有unread
检测它的字段。
我试过这个
SELECT *, count(unread) as nums
FROM dialogs JOIN messages ON dialogs.id=messages.dialog_id
GROUP BY dialogs.id
HAVING count(unread) <> 0
但总是得到消息的总数
我有对话和消息。目标是选择对话框及其未读消息的计数。表消息具有unread
检测它的字段。
我试过这个
SELECT *, count(unread) as nums
FROM dialogs JOIN messages ON dialogs.id=messages.dialog_id
GROUP BY dialogs.id
HAVING count(unread) <> 0
但总是得到消息的总数
哦!!!按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') ......
如果您说该表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
如果如您所说,“未读”是未读消息的计数,那么它总是有一个值,即使为零,并且总是包含在 COUNT(unread) 中。
尝试插入一个WHERE messages.unread != 0