我正在聊天系统的两个用户之间选择最后一条消息。然而,尽管我能够很好地选择它,但我无法根据未阅读的消息订购消息。
这就是我的聊天桌的样子
CREATE TABLE IF NOT EXISTS `mychat_table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`from_id` int(10) unsigned NOT NULL,
`to_id` int(10) unsigned NOT NULL,
`message` text NOT NULL,
`sent` int(10) unsigned NOT NULL DEFAULT '0',
`read_statu` tinyint(1) unsigned NOT NULL DEFAULT '0',
`is_deleted` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `to` (`to_id`),
KEY `from` (`from_id`),
KEY `direction` (`is_deleted`),
KEY `read` (`read_statu`),
KEY `sent` (`sent`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=58 ;
现在选择两个用户之间的最后一条消息,我做了这个
$recup_id = mysqli_query($connection, "SELECT MAX(`id`) AS id FROM mychat_table WHERE (`from_id`='$id' OR `to_id`='$id') AND
(is_deleted!='$id' AND is_deleted >=0) ORDER BY read_statu ASC GROUP BY (IF(`to_id`='$id', `from_id`, `to_id`)) LIMIT 5 ") or die(mysqli_error($connection));
问题
通常,我认为当我执行ORDER BY read_statu ASC时,它会首先显示状态为0的消息,依此类推,但事实并非如此。
如何通过排序来显示这些用户之间的消息,即在显示read_statu优于0的消息之前,它将首先显示read_statu=0的消息
你是对的,ORDER BY read_status ASC会给你一个按读取状态排序的列表,但是
- 不能在GROUP BY子句之前执行ORDER BY
- 如果您正在使用MAX(id)函数,则无论您使用何种顺序,都将返回所选组的最大id
- 您正在使用GROUP BY,这将使结果减少到每个用户只有一个条目,因此您将无法访问所有最后五条消息
为了真正得到你想要的结果,你可以简化你的查询,以便显示最后五条消息,优先显示未读的消息:
SELECT * FROM mychat_table
WHERE (`from_id`='$id' OR `to_id`='$id') AND (is_deleted!='$id' AND is_deleted >=0)
ORDER BY read_statu ASC, id DESC
LIMIT 5
如果你想让结果整洁显示,你可以使用这个
SELECT (IF(`to_id`='$id', `from_id`, `to_id`)) AS contact, message, read_statu
FROM mychat_table
WHERE (`from_id`='$id' OR `to_id`='$id') AND (is_deleted!='$id' AND is_deleted >=0)
ORDER BY read_statu ASC, id DESC, contact
LIMIT 5
如果您需要分组而不是read_status的首选项,那么只需将contact放在ORDERBY子句的开头:
SELECT (IF(`to_id`='$id', `from_id`, `to_id`)) AS contact, message, read_statu
FROM mychat_table
WHERE (`from_id`='$id' OR `to_id`='$id') AND (is_deleted!='$id' AND is_deleted >=0)
ORDER BY contact, read_statu ASC, id DESC
LIMIT 5
我没有你的数据,所以请尝试不同顺序的顺序参数,直到你得到想要的结果,这应该会让你达到目的。
如果你只想看到每个用户的最后一条消息(最好是未读的)(每个用户只有一条消息),并且你可以接受只有用户id和消息文本(这应该足够显示),那么试试这个:
SELECT DISTINCT from_id, (
SELECT message FROM mychat_table m2
WHERE to_id='$id' AND m2.from_id=m1.from_id
ORDER BY read_statu ASC, id DESC
LIMIT 1
) AS message FROM mychat_table m1
WHERE to_id='$id'
LIMIT 5