【问题标题】:php mysql concatenate sent and received messagesphp mysql 连接发送和接收的消息
【发布时间】:2011-11-09 10:28:59
【问题描述】:

私人消息系统显示串联的用户消息。

• 用户发送和接收的消息按 time_sent 排序
• 每个消息选项卡将显示发送者/接收者的姓名、消息和发送时间
• 有关如何提高查询速度(如索引等)的任何提示?

MESSAGES TABLE 
--------------
id sender receiver time_sent message opened recipientDelete senderDelete

Users Table
-----------
id first_name last_name

我的尝试:

$userid = logged in user
$query="SELECT MAX(id), sender, receiver, MIN(time_sent), message, opened 
        FROM messages 
        WHERE (receiver='$userid' AND recipientDelete='0') 
             OR (sender='$userid' AND senderDelete='0') 
        GROUP BY receiver,sender 
        ORDER BY time_sent DESC LIMIT 8";

结果/问题:
如果登录用户 (id=3) 收到来自两个用户 (id=1,and id=2) 的消息,则此查询将返回来自用户 1 和 2 的消息

第二次尝试:

 $query="SELECT MAX(id), sender, receiver, MIN(time_sent), message, opened      
     FROM ( SELECT 
              CASE WHEN sender = '$userid' THEN receiver ELSE sender END
              MIN(time_sent)
            FROM messages 
            WHERE sender = '$userid' OR receiver = '$userid' 
            GROUP BY CASE WHEN sender = '$userid' THEN receiver ELSE sender END)
         ORDER BY time_sent DESC 
         LIMIT 8";

返回错误。

【问题讨论】:

  • 第一个查询将错误消息组合在一起。例如,如果您(jason=user 1)正在查看您的收件箱,则查询会将您(用户 1)作为发送者或接收者的任何其他用户(2、3、4 等)分组。因此,在用户 1-2 和 1-3 之间发送的消息应该是 2 条单独的消息时,它们将组合为一条消息。

标签: php mysql private-messaging


【解决方案1】:

您正在从派生表中进行选择。在 MySQL 中,该子查询必须是别名:

SELECT ...
FROM ( SELECT ...) AS subqueryalias
                   ^^^^^^^^^^^^^^^^
WHERE ...

【讨论】:

  • 我不确定如何执行子查询。有了上面的信息(表名和行),你能提供一个解决方案吗?如果不是,您还需要什么其他信息?
  • 您已经在执行子查询。 FROM (SELECT ...) IS 是子查询。你应该有... ELSE sender END) AS subqueryalias
  • 我尝试添加 >AS m ORDER BY time_sent DESC LIMIT 8"; 但返回错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多