我正在选择聊天系统的两个用户之间的最后一条消息。但是,虽然我能够很好地选择它,但我无法根据尚未阅读的消息来订购消息。
这就是我的聊天表的样子
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的消息?
答案 0 :(得分:0)
你是对的,ORDER BY read_status ASC会给你一个按读状态排序的列表,但是
要真正获得所需的结果,您可以简化查询,以便显示最后五条消息,提供未读优先级:
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,那么只需在ORDER BY子句的开头放置联系人:
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