Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在两个用户之间选择带有组和If语句的最后一条消息,并将其与Order by耦合_Php_Mysqli - Fatal编程技术网

Php 在两个用户之间选择带有组和If语句的最后一条消息,并将其与Order by耦合

Php 在两个用户之间选择带有组和If语句的最后一条消息,并将其与Order by耦合,php,mysqli,Php,Mysqli,我正在选择聊天系统两个用户之间的最后一条消息。然而,尽管我能够很好地选择它,但我无法根据尚未阅读的消息对消息进行排序 这就是我的聊天桌的样子 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

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

这就是我的聊天桌的样子

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));
问题

通常我认为,当我通过read_statu ASC进行订购时,它将首先显示状态为0的消息,以此类推,但它不会


如何通过排序来显示这些用户之间的消息,在显示读取状态优于0的消息之前,它将首先显示读取状态为0的消息?

您是对的,按读取状态排序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_状态,则只需将contact放在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
    
    我没有您的数据可供使用,因此请以不同的顺序尝试order参数,直到获得所需的结果,这应该会使您达到目的

    如果您只想看到来自每个用户的最后一条消息(最好是未读的消息)(每个用户只有一条消息),并且您只需要有用户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
    

    第一个请求没有按用户和选择他们交换的最后一条消息对聊天表中的结果进行分组。它给了我每个用户的消息,而没有对它们进行分组。第二个请求引发了一个错误,因为ORDER BY子句中没有字段colled mgroup
    mgroup
    ,实际上是我第一次处理您的问题时的一个复制错误,我将其更正为
    contact
    。order BY子句中参数的顺序可以调整,以便它们符合您的需要,希望第三个示例现在能够做到这一点。即使使用第三个方法,我仍然可以得到相同的结果。它不会按用户对结果进行分组,而是按用户列出消息。因此,您想要的实际上是每个用户最后5条已读消息?那么可能是20条、30条或更多的信息?或者你真的想对用户分组,所以每个用户只有一条消息?因此,如果你有5个结果,它将来自5个不同的用户?@hexerisofware我想对用户进行分组,并从每个用户那里获取最后一条消息,但我希望他们先按read_statu=0进行分组,然后按read_statu进行排序=0之后。因此,我只需要一个用户发送一条消息(发送给该用户或他已发送的最后一条消息)。因此,即使一个用户发送了10条消息,也只会显示最后一条带有用户id的消息。基本上,当你想查看你的信息时,我正在尝试做facebook所做的事情。当你向某人或某人向你发送消息时