mysql - 使用 GROUP BY、ORDER BY、GROUP_CONCAT 获取最旧的行

标签 mysql sql

我正在尝试使用以下语句来获取登录用户的消息列表。问题是尽管使用组和顺序,但它并不总是显示最新的消息。有人能解释一下吗?我应该使用子查询吗?

SELECT 
  messages.message_id,
  messages.message_parent_id,
  messages.message_project_id,
  messages.message_from_id,
  messages.message_from_email,
  messages.message_subject,
  messages.message_body,
  messages.message_sent_datetime,
  CONCAT(
    u_from.forename,
    ' ',
    u_from.surname
  ) AS from_x,
  GROUP_CONCAT(
    CONCAT(
      u_to.user_id,
      '||',
      u_to.forename,
      ' ',
      u_to.surname
    )
  ) AS to_x,
  m_recipients.recipient_message_read 
FROM
  messages 
  INNER JOIN users AS u_from 
    ON messages.message_from_id = u_from.user_id 
  INNER JOIN message_recipients AS m_recipients 
    ON messages.message_id = m_recipients.recipient_message_id 
  INNER JOIN users AS u_to 
    ON m_recipients.recipient_user_id = u_to.user_id 
WHERE (
    m_recipients.recipient_user_id = '$current_user_id' 
    OR messages.message_from_id = '$current_user_id'
  ) 
  AND messages.message_project_id = '$project_id' 
GROUP BY messages.message_parent_id 
ORDER BY messages.message_sent_datetime DESC 

fiddle :http://sqlfiddle.com/#!9/7fbfa/3

最佳答案

你确定不需要吗?

按 messages.message_parent_id、message.message_id 分组

如果您确定将 messages.message_sent_datetime 替换为

MAX(messages.message_sent_datetime) as message_sent_datetime,
...
ORDER BY message_sent_datetime

MIN(messages.message_sent_datetime) as message_sent_datetime,
...
ORDER BY message_sent_datetime

好的,试试 this way :

SELECT 
  messages.message_id,
  messages.message_parent_id,
  messages.message_project_id,
  messages.message_from_id,
  messages.message_from_email,
  messages.message_subject,
  messages.message_body,
  MAX(messages.message_sent_datetime) AS message_sent_datetime,
  messages.message_important,
  u_from.from_x,
  GROUP_CONCAT(u_to.to_x),
  m_recipients.recipient_message_read 
FROM
  messages 
  INNER JOIN (
    SELECT 
      user_id,
      CONCAT(forename,' ',surname) AS from_x
    FROM users 
    ) AS u_from 
    ON messages.message_from_id = u_from.user_id 
  INNER JOIN message_recipients AS m_recipients 
    ON messages.message_id = m_recipients.recipient_message_id 
  INNER JOIN 
     (SELECT
        user_id,
        CONCAT(user_id,'||',forename,' ',surname) AS to_x
      FROM users 
     ) AS u_to 
    ON m_recipients.recipient_user_id = u_to.user_id 
WHERE (
    m_recipients.recipient_user_id = 1
    OR messages.message_from_id = 1
  ) 
  AND messages.message_project_id = 1
GROUP BY messages.message_parent_id
ORDER BY messages.message_sent_datetime DESC

关于mysql - 使用 GROUP BY、ORDER BY、GROUP_CONCAT 获取最旧的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29237861/

相关文章:

php - 如何应用 mysql 200 个连接限制?

mysql - 三张 table 相连。即使一张表为空也显示查询结果

mysql - SQL select查询顺序通过添加两个字段表现

mysql - 如何在没有外键的情况下关联两个表?

SQL SELECT 连接?

mysql - 如何编写简单的 MySQL 工作台查询

mysql - (A 加入 B) 加入 (C 加入 D)

sql - 使用左连接 T-SQL 进行聚合和重复行

sql - 使用SQL计算GPA,报 "Invalid Identifier"错误

php - 使用 mySQL 在 PHP 中 SQL 不返回结果