mysql - 在 SQL 中创建消息列表

标签 mysql sql phpmyadmin

我正在尝试创建一个消息列表,例如 Facebook。

  1. 仅显示用户对话中的最后一条消息(历史记录)
  2. 当我发送时显示我的,当我收到答复时显示已答复的消息(1 行)

数据库数据:

enter image description here

SQL查询

SELECT m.message_id, u.username, m.subject, m.message
     , m.status, UNIX_TIMESTAMP(m.date) as date
  FROM users u
  LEFT JOIN messages m ON m.sender_id = u.id
 WHERE m.message_id in (SELECT max(msg.message_id) 
                          FROM messages msg 
                         WHERE msg.receiver_id = 3 
                         GROUP BY sender_id)
 UNION
SELECT m.message_id, u.username, m.subject, m.message
     , m.status, UNIX_TIMESTAMP(m.date) as date
  FROM users u
  LEFT JOIN messages m ON m.receiver_id = u.id
 WHERE m.message_id in (SELECT max(msg.message_id)  
                          FROM messages msg 
                         WHERE msg.sender_id = 3 
                         GROUP BY receiver_id)
 GROUP BY u.username
 ORDER BY date DESC

我尝试接收我发送的所有消息(我的 id = 3)以及所有发送给我和按用户名分组的消息

SQL结果:

Array
(
    [0] => Array
        (
            [message_id] => 10
            [username] => 8888
            [subject] => без темы
            [message] => 555
            [status] => 0
            [date] => 11 August 2012, 2:22
            [user_image] => http://127.0.0.1/auth_system_1/upload_images/65_empty.jpg
        )

    [1] => Array
        (
            [message_id] => 7
            [username] => 8888
            [subject] => hi
            [message] => 333
            [status] => 0
            [date] => 11 August 2012, 2:15
            [user_image] => http://127.0.0.1/auth_system_1/upload_images/65_empty.jpg
        )

    [2] => Array
        (
            [message_id] => 4
            [username] => 6666
            [subject] => Тема
            [message] => 2
            [status] => 0
            [date] => 11 August 2012, 2:02
            [user_image] => http://127.0.0.1/auth_system_1/upload_images/65_empty.jpg
        )

    [3] => Array
        (
            [message_id] => 1
            [username] => fffffffff
            [subject] => privet
            [message] => tttt
            [status] => 0
            [date] => 11 August 2012, 1:38
            [user_image] => http://127.0.0.1/auth_system_1/upload_images/65_empty.jpg
        )

)

如您所见,GROUP BY 用户名不起作用。它显示 3->7 和 7->3,但 7->3 是答案和最后一条消息。我不知道为什么组不起作用。也许你可以帮助我用更简单的方法来解决这个问题?

因此,SQL 必须具有“sender_id = 3”、“receiver_id = 3”,并且我的表数据结果必须是

  • message_id -> 1
  • message_id -> 4
  • message_id -> 10

最佳答案

我认为您的查询正在产生“正确”的结果,就好像您想查看某些对话中的最后一条消息一样,您应该按 conversation_id 进行分组。不过,我在架构中没有看到这个字段。

如果您执行WHERE sender_id = 3 GROUP BY receive_id,那么它是正确的,该查询会返回消息 1 和 7,因为这些消息已发送至不同的 人,因此在你的设计中他们是不同的对话。

如果您只想查看您发送的最后一条消息,只需删除 UNION 第二部分中的 GROUP BY 即可。否则,请考虑重新设计您的架构。

<小时/>

编辑:

尝试这个查询:

SELECT m.message_id, u.username, m.subject, m.message,
       m.status, UNIX_TIMESTAMP(m.date) as `date`
  FROM users u
  LEFT JOIN messages m ON m.sender_id = u.id
 WHERE m.message_id IN (
    SELECT max(message_id) 
      FROM messages
     WHERE receiver_id = 3 OR sender_id = 3
     GROUP BY least(sender_id,receiver_id), 
              greatest(sender_id,receiver_id)
    );

一些注意事项:

  1. 不再需要UNION
  2. 这种方法会将两方之间的所有电子邮件视为一次对话,但这并不总是正确的。您可能想要重新设计此方法;
  3. 使用保留字(例如date)作为列名或别名是一种不好的风格,请尽量避免这种情况。或者如果确实使用反引号,也可以使用它们。

关于mysql - 在 SQL 中创建消息列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11921204/

相关文章:

mysql - ERROR 1075 不正确的表定义;只能有一个自动列,并且必须将其定义为键

PHP MySQL Zend-ACL - 图形显示ACL :

mysql - 找不到此 SQL 错误的原因

mysql - 在 MySQL WorkBench 中从 SQL 脚本生成图表

php - 查询在 phpmyadmin 中有效,但在 PHP 中无效

mysql - phpMyAdmin中的批量更新栏目

php - 无法登录 - 并且没有错误消息。 - PHP

php - 子查询后删除并返回结果

sql select min,从同一行的不同列返回值并进行分组

sql - Lotus DB 到 SQL Server 的迁移