选择具有Group和If语句以及Order by的两个用户之间的最后一条消息


Select the last message between two users with Group and If statement coupled with Order by

我正在聊天系统的两个用户之间选择最后一条消息。然而,尽管我能够很好地选择它,但我无法根据未阅读的消息订购消息。

这就是我的聊天桌的样子

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会给你一个按读取状态排序的列表,但是

  1. 不能在GROUP BY子句之前执行ORDER BY
  2. 如果您正在使用MAX(id)函数,则无论您使用何种顺序,都将返回所选组的最大id
  3. 您正在使用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