【问题标题】:How to ignore others messages if from_user has already sent a message?如果 from_user 已经发送消息,如何忽略其他消息?
【发布时间】:2019-12-11 10:06:31
【问题描述】:

这是我的查询

"SELECT * FROM messages WHERE to_user = :user ORDER BY time ASC"

问题在于它忽略了from_user 列并显示来自单个用户的多条消息,我只想显示来自from_user 列中的每个用户的最后一条消息,并向登录的用户显示在to_user 列中 如果from_user 已经发送消息,如何忽略其他消息? 我想只选择最后一条消息from_userto_user

我尝试了限制,但它只选择了一条用户消息,其中一条位于 from_user 列中

PHP 代码

//$sql = "SELECT * FROM messages WHERE to_user = :user ORDER BY time ASC";
    $sql = "SELECT DISTINCT from_user, messages.* FROM messages WHERE to_user = :user ORDER BY time ASC";
        $stm = $conexao_pdo->prepare($sql);
        $stm->bindParam(':user', $user_logged);
        $stm->execute();

这是我在表 messages 中的列

【问题讨论】:

  • WHERE to_user = :user ORDER BY time ASC LIMIT 1
  • 我尝试了限制,但它只选择了一个用户消息,该消息位于from_user 列中>
  • 好的,你可以试试SELECT DISTINCT to_user, * FROM messages WHERE to_user = :user ORDER BY time ASC
  • 现在它在 pdo Call to a member function bindParam() 中给我一个错误
  • 尝试摆脱bindParam(),只需要$stm->execute(['user' => $user_logged]);

标签: php mysql sql


【解决方案1】:

据我了解的问题,我相信您必须使用GROUP BY 运算符,解决方案应如下所示:

SELECT Max(time), messages.* FROM messages WHERE to_user = :user
Group BY from_user
ORDER BY time ASC

(您的示例数据应该包含一些相关内容)

编辑: 不要在 SELECT 中混合聚合值和非聚合值,请参阅下面的我的 cmets。

   SELECT 
      messages.* 
   FROM 
      messages 
   JOIN 
      (SELECT 
          from_user, MAX(time) MAX_TIME 
       FROM 
           messages 
       WHERE 
           to_user = :user 
       GROUP BY 
           from_user) MAX_QUERY 
    ON messages.from_user = MAX_QUERY.from_user 
       AND messages.time = MAX_QUERY.MAX_TIME 
    WHERE 
       to_user = :user;

【讨论】:

  • 还是同样的问题,只选择一个用户from_userWHERE to_user = :user也许我应该在一段时间内或foreach?
  • 我想创建一个子查询而不是循环以避免 n+1 查询问题。 (由于缺少样本数据,我不确定是否完全理解问题......)
  • 所以我应该避免 while ?或不?它现在向我显示很好,现在只有来自每个用户的最后一条消息
  • 在 db-operations 的上下文中,您应该(如果可以预见很多循环和结果查询)。请看n+1 query problem
  • 我现在有一个问题,消息不是来自用户的最后一条消息,如何解决?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
相关资源
最近更新 更多