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

时间:2015-03-07 18:13:51

标签: 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` 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的消息?

1 个答案:

答案 0 :(得分:0)

你是对的,ORDER BY read_status ASC会给你一个按读状态排序的列表,但是

  1. 您不能在GROUP BY子句
  2. 之前执行ORDER BY
  3. 您正在使用MAX(id)函数,无论您使用何种顺序,都将返回所选组的最大ID
  4. 您正在使用GROUP BY,这会将结果减少到每个用户只有一个条目,因此您将无法访问所有最后五条消息
  5. 要真正获得所需的结果,您可以简化查询,以便显示最后五条消息,提供未读优先级:

    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