Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.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 Group by在mysql select语句中工作不正常_Php_Mysql_Select - Fatal编程技术网

Php Group by在mysql select语句中工作不正常

Php Group by在mysql select语句中工作不正常,php,mysql,select,Php,Mysql,Select,我有一个用于存储对话信息的表。这是我的疑问: SELECT a.id, a.`from member_id`, a.`to member_id`, IF(a.`from member_id`={$targetID}, a.`to member_id`, a.`from member_id`) as other_id, a.text, MAX(a.`date sent`) as `date sent`, a.to_read, m.

我有一个用于存储对话信息的表。这是我的疑问:

  SELECT
    a.id,
    a.`from member_id`,
    a.`to member_id`,
    IF(a.`from member_id`={$targetID}, a.`to member_id`, a.`from member_id`) as other_id,
    a.text,
    MAX(a.`date sent`) as `date sent`,
    a.to_read,
    m.`first name`,
    m.`last name`,
    m.avatar_name,
    m.avatar_status
  FROM message a
  JOIN members m on IF(a.`from member_id`={$targetID}, a.`to member_id`, a.`from member_id`) = m.id
  WHERE (a.`from member_id`={$targetID} OR a.`to member_id`={$targetID}) AND a.active=1
  GROUP BY IF(a.`from member_id`={$targetID}, a.`to member_id`, a.`from member_id`)
  ORDER BY `date sent` DESC
消息表如下所示:

id               int(11)           id of the message    
from member_id   int(11)           id of the person the message was sent from
to member_id     int(11)           id of the person the message was sent to 
date sent        datetime          date of when it was sent 
active           tinyint(1)        if the message is deleted    
text             longtext      the text of the message
from_read        tinyint(1)        boolean to know if the person who sent it read it 
to_read          tinyint(1)            boolean to know if the person who it got sent to read it
此select语句用于显示您当前的对话列表。例如,当你在安卓智能手机上点击短信图标时,你会看到一个对话列表,每个对话都有你和另一个人之间交换的最新消息,而这正是你的活动

因此,我在select语句中所做的是获取id位于
to
from
中的消息,然后将其分组,以便使用的行是您和其他人之间交换的最新消息

问题是,当一个人自己给自己发短信时,最近的短信不会出现

有人知道问题出在哪里吗


谢谢。

引用您的问题:

因此,我在select语句中所做的是从何处获取消息 您的id位于“收件人”或“发件人”中,然后将其分组,以便使用该行 是您和其他人之间交换的最新消息

这可能是你想要做的。这不是查询正在做的事情。
分组依据
子句是:

GROUP BY IF(a.`from member_id`={$targetID}, a.`to member_id`, a.`from member_id`)
当它遇到多个符合条件的行时,它会从这些行中为“到达”字段选择任意值。
order by
与选择最新消息无关,即使这是您想要的

要获取两个发件人之间的最新邮件,请尝试以下操作:

select least(`from member_id`, `to member_id`) as id1,
       greatest(`from member_id`, `to member_id`) as id2,
       max(id) as theid
from messages m
group by least(`from member_id`, `to member_id`),
       greatest(`from member_id`, `to member_id`);

这将提供最新消息ID的列表(假设它们是按递增顺序分配的)。您可以将其加入查询以获取最新消息。

我不确定是否理解您的查询。消息表中的行是来自多个对话的消息。我正在尝试从此表中获取特定行。我想要的每一行都应该是你和另一个人之间交换的最新消息。此外,返回的行的顺序也应按顺序排列,以便最新的对话位于顶部。此外,当group by条件满足多行时,我会尝试使它选择最近的行,因为我将
MAX(a.date sent)作为date sent
放在顶部,所以这不就是通过选择最近的行来创建组吗?@omega。你的问题的答案是“不”。如果您想要最近的一个,您需要计算它并加入其中。