2013-11-19 12 views
2

У меня есть таблица в MySQL, которая содержит разговоры. Эти разговоры состоят из сообщений. Один разговор выглядит как таблица ниже.Получить значения столбцов на основе последней записи (не null)

Importance и eId только в некоторых случаях. То, что я пытаюсь получить из таблицы, - последнее сообщение в разговоре (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..  | 
+----------------+-----------+----------+----------+------------+-------+---------+ 

Я не могу получить запрос на работу. Любая помощь будет назначена. Благодарю.

+1

Я думаю, что вы будете иметь, чтобы запустить некоторые подзапросы, чтобы получить эту информацию, я не вижу никакого способа сделать это в один запрос. – Erik

+0

@Erik Красная тряпка для быка - хотя я думаю, это зависит от того, что вы подразумеваете под «одним запросом» ;-) – Strawberry

ответ

0

Это не обязательно лучшее решение, как мне пришлось создавать на локальном 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)

+0

Вы могли бы хотя бы попытаться избавиться от этих страшных нестандартных скобок (они не необходимо в SQL Server) –

+0

@a_horse_with_no_name Они нужны, если использовать ключевые слова как имена столбцов (например, «Время»). Но ваше желание - моя возлюбленная, я их удалил. –

+0

Я знаю это, но с использованием названий столбцов они не нужны. –

0

Если в таблице больше, чем один разговор в таблице, и вы хотите получить желаемый результат для всех диалоговых окон одновременно, то я думаю, вам нужно присоединиться 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); 

Соединить будет выглядеть следующим образом:

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 AND talkId.

0

Может быть, немного Oldschool, но должен сделать трюк:

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 demo

Смежные вопросы