mysql - 根据最后一个条目获取列值(非空)

标签 mysql sql group-by max

我在 MySQL 中有一个用于保存对话的表。这些对话由消息组成。单个对话如下表所示。

ImportanceeId 只是有时设置。我想从表中获取的是对话中的最后一条消息 (messageId = 4) 但最后一组 importance 和最后一组 eId

所以,从这张表

+----------------+-----------+----------+----------+------------+-------+---------+
| conversationId | messageId | time     | status   | importance | eId   | message |
+----------------+-----------+----------+----------+------------+-------+---------+
| 25             | 4         | 11:00:00 | feedback | NULL       | NULL  | d..     |
+----------------+-----------+----------+----------+------------+-------+---------+
| 25             | 3         | 10:00:00 | open     | MEDIUM     | NULL  | c..     |
+----------------+-----------+----------+----------+------------+-------+---------+
| 25             | 2         | 09:00:00 | feedback | NULL       | 123   | b...    |
+----------------+-----------+----------+----------+------------+-------+---------+
| 25             | 1         | 08:00:00 | open     | HIGH       | NULL  | a...    |
+----------------+-----------+----------+----------+------------+-------+---------+

我需要得到这个结果

+----------------+-----------+----------+----------+------------+-------+---------+
| conversationId | messageId | time     | status   | importance | eId   | message |
+----------------+-----------+----------+----------+------------+-------+---------+
| 25             | 4         | 11:00:00 | feedback | MEDIUM     | 123   | d..     |
+----------------+-----------+----------+----------+------------+-------+---------+

我无法使查询正常工作。 任何帮助将不胜感激。谢谢。

最佳答案

如果表中有多个conversationId,而你想同时对所有的conversationId得到想要的结果,那么我觉得你需要在子查询中加入3个子查询。类似于下面的 3 个:

SELECT messages.conversationId, messages.messageId, messages.time, messages.status, messages.message
FROM messages
JOIN  (
  SELECT conversationId, MAX(messageId) as messageId
  FROM messages
  GROUP BY conversationId) as m2
ON (messages.messageId = m2.messageId);


SELECT messages.conversationId, messages.importance
FROM messages
JOIN  (
  SELECT conversationId, MAX(messageId) as messageId
  FROM messages
  WHERE importance IS NOT NULL     
  GROUP BY conversationId) as m3
ON (messages.messageId = m3.messageId);

SELECT messages.conversationId, messages.eId
FROM messages
JOIN (
  SELECT conversationId, MAX(messageId) as messageId
  FROM messages
  WHERE eId IS NOT NULL
  GROUP BY conversationId) as m4
ON (messages.messageId = m4.messageId);

JOIN 看起来像这样:

SELECT 
main.conversationId, 
main.messageId, 
main.time, 
main.status, 
importance.importance, 
eId.eId, 
main.message
FROM (
  SELECT messages.conversationId, messages.messageId, messages.time, messages.status, messages.message
  FROM messages
  JOIN  (
    SELECT conversationId, MAX(messageId) AS messageId
    FROM messages
    GROUP BY conversationId) AS m2
    ON (messages.messageId = m2.messageId)
        ) AS main
JOIN (
  SELECT messages.conversationId, messages.importance
  FROM messages
  JOIN  (
    SELECT conversationId, MAX(messageId) AS messageId
    FROM messages
    WHERE importance IS NOT NULL
    GROUP BY conversationId) AS m3
    ON (messages.messageId = m3.messageId)
        ) AS importance
JOIN (
  SELECT messages.conversationId, messages.eId
  FROM messages
  JOIN (
    SELECT conversationId, MAX(messageId) AS messageId
    FROM messages
    WHERE eId IS NOT NULL
    GROUP BY conversationId) AS m4
    ON (messages.messageId = m4.messageId)
      ) AS eId
ON (
  main.conversationId = importance.conversationId
  AND main.conversationId = eId.conversationId
    );

这是一个 sqlfiddle:http://sqlfiddle.com/#!2/857aa/38 .这假定 messageId 是唯一的。如果它不是唯一的,那么您需要加入 messageId 和 conversationId。

关于mysql - 根据最后一个条目获取列值(非空),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20076159/

相关文章:

mysql - 如何获取关注者列表,同时检查我是否关注关注者?

c# - 将文本框值更新为 sql

MySQL order by before group by

sql - 如何对整个表的多列进行RANK?

sql - 如何通过在 MSSQL 中使用 Pivot with Month 获取评级列的值及其对每个特定月份的定义

sql-server - SQL 查询改进 - 使用 max 和 groupby 选择

mysql - 夹板和 MySQL : Null storage passed as non-null param

MySQL View 选择 future N天

javascript - jQuery 更改页面 - 但我如何/在哪里更改 "acquire"?

mysql - 重命名 100GB 表