繁体   English   中英

根据最后一个条目获取列值(不为null)

[英]Get column values based on last entry (not null)

我在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..     |
+----------------+-----------+----------+----------+------------+-------+---------+

我无法查询工作。 任何帮助将被申请。 谢谢。

这不一定是最好的解决方案,因为我必须在本地SQL Server中创建此解决方案(尝试时SQL小提琴出现故障,并且没有安装MySQL),也是“快速而肮脏的”查询(意味着:可能会有更好的解决方案)解决方案),但由于我很乐意提供帮助,因此无论如何都会发布它。
如果您碰巧等待社区提供另一个可能更好的解决方案,我不会感到冒犯:)那就是我想说的:)

SELECT TOP 1 conversationId,messageId,RecTime,ConvStatus,
       (
            SELECT TOP 1 importance
            FROM Conversations
            WHERE importance IS NOT NULL
            ORDER BY messageId DESC
       ) AS importance,
       (
            SELECT TOP 1 eId
            FROM Conversations
            WHERE eId IS NOT NULL
            ORDER BY messageId DESC
       ) AS eId,
UsrMessage
FROM Conversations
ORDER BY messageId DESC
GO

(不要忘记,您可能必须更改“格式设置项”才能使其在MySQL中运行)

如果表中有多个对话ID,并且您希望同时为所有对话ID获得所需的结果,那么我认为您需要在子查询中加入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和sessionId。

也许有点老套,但应该做到这一点:

SELECT c.conversationId as convId, max(c.messageId), t.time, s.status, i.importance, e.eId, c.message
  FROM convs c,
   (SELECT conversationId, max(time) AS time FROM convs) t,
   (SELECT conversationId, status FROM convs WHERE status IS NOT NULL ORDER BY messageId DESC) s,
   (SELECT conversationId, importance FROM convs WHERE importance IS NOT NULL ORDER BY messageId DESC) i,
   (SELECT conversationId, eId FROM convs WHERE eId IS NOT NULL ORDER BY messageId DESC) e
 WHERE 1=1
   AND t.conversationId = c.conversationId
   AND s.conversationId = c.conversationId
   AND i.conversationId = c.conversationId
   AND e.conversationId = c.conversationId
 GROUP BY c.conversationId

SQL Fiddle演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM