2013-08-09 1 views
-1

Я пытаюсь создать свой собственный обмен сообщениями, как с помощью SMS в телефонах.Как сделать заказ по первой записи другого заказа по результату?

У меня есть таблица MySQL как этот

id     (the message id) 
from_member_id  (the id of the member who sent this message) 
to_member_id  (the id of the member who the message was sent to) 
date sent   (the date it was sent) 
active    (if this message is deleted or active) 
text    (the text) 

И я хочу, чтобы получить информацию в специальном упорядоченным образом.

Сначала он должен быть отсортирован по идентификатору, который вам не нужен (назовите его «другим» id). Затем для каждой части этого заказа требуется получить самую большую запись (которая должна быть самой последней датой), а затем отсортировать разделы по значению даты этой записи.

я могу сделать первый заказ на это:

SELECT 
    from_member_id, 
    to_member_id, 
    (CASE WHEN from_member_id = ? THEN to_member_id ELSE from_member_id END CASE) AS conversation_member_id, 
    date_sent 
FROM table 
WHERE from_member_id = ? 
OR to_member_id = ? 
ORDER BY conversation_member_id DESC, date_sent DESC 

где ? мой идентификатор.

Но проблема в том, как сделать второй заказ, где мне нужно заказать разделы по дате записи (которая должна быть самой последней датой). Заметьте, когда я говорю раздел, я имею в виду группу записей с тем же «другим» идентификатором.

Кто-нибудь знает, как это сделать?

Спасибо.

EDIT:

Пример

Если мой идентификатор 5:

From To Date 
5  6 july 28 
6  5 july 7 
6  5 july 7 
5  2 july 26 
5  2 july 26 
2  5 july 26 

Так дата 28 июля должен прийти на вершине, потому что это произошло совсем недавно, хотя есть даты в этом разделе, которые до июля 26.

Итак, когда я делаю первый заказ, он заказывает другой идентификатор, который будет 6, а затем 2. Единицы с 6 - это одна секция, а вторая с 2 - вторая.

+0

Я не за тобой. Можете ли вы привести пример желаемого результата? –

+0

ok Я добавил пример вывода. Он был заказан «другим» id, поэтому другой идентификатор будет 6 и 2, поэтому вся запись с 6 группируется, а записи с 2 группируются (так что 2 раздела). Затем он упорядочивается по дате для каждого раздела. Затем он упорядочивается по дате первой записи каждого раздела (которая должна быть самой последней датой), поэтому июль 28 более поздний, чем 26 июля, поэтому он отображается сверху. – omega

ответ

1

Я являюсь парень MS SQL, но я верю, что это достаточно ясно:

CREATE TABLE #Messages 
(
FromID INT NOT NULL, 
ToID INT NOT NULL, 
Date DATETIME2(0) NOT NULL, 
Text VARCHAR(200) NOT NULL 
) 
INSERT INTO #Messages (FromID, ToID, Date, Text) VALUES 
    (5, 6, '2013-07-28 12:00', 'A'), 
    (6, 5, '2013-07-07 02:00', 'B'), 
    (6, 5, '2013-07-07 01:00', 'C'), 
    (5, 2, '2013-07-26 03:00', 'D'), 
    (5, 2, '2013-07-26 02:00', 'E'), 
    (2, 5, '2013-07-26 01:00', 'F') 

DECLARE @Me INT = 5 
SELECT 
    M.FromID, M.ToID, M.Date, M.Text 
FROM 
    #Messages AS M 
    INNER JOIN 
     (
     SELECT 
      CASE WHEN FromID = @Me THEN ToID ELSE FromID END AS ID, 
      MAX(Date) AS MostRecentDate 
     FROM 
      #Messages 
     GROUP BY 
      CASE WHEN FromID = @Me THEN ToID ELSE FromID END 
     ) AS Seq ON CASE WHEN M.FromID = @Me THEN M.ToID ELSE M.FromID END = Seq.ID 
ORDER BY 
    Seq.MostRecentDate DESC, M.Date DESC 
+0

Это супер сложный для меня LOL. Я могу просто сделать этот последний заказ в моем приложении для Android после получения данных. Я думаю, что это может быть более эффективным в java, чем в sql. – omega

+2

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

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

  • Нет связанных вопросов^_^