Сортировать по, по группам - Проблемы - PullRequest
1 голос
/ 25 июня 2010

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

В одном разделе веб-приложения я ищу последнийкомментарий, связанный любым отдельным пользователем, отсортированный по дате.В один и тот же день и время может быть несколько комментариев от всех пользователей, но этот запрос должен захватывать только последний комментарий на основе даты.

 comments table
 -----------------------------------------------------------------
 | comment_id  |  user_id   | comment      |  date_time          |
 -----------------------------------------------------------------
 |    1        |    2       |  Test_1      | 2010-01-01 00:00:00 |
 |    2        |    2       |  Test_2      | 2010-02-01 00:00:00 |
 |    3        |    2       |  Test_3      | 2010-03-01 00:00:00 |
 |    4        |    4       |  Test_4      | 2010-04-01 00:00:00 |
 |    5        |    4       |  Test_5      | 2010-05-01 00:00:00 |
 |    6        |    4       |  Test_6      | 2010-06-01 00:00:00 |
 |    7        |    3       |  Test_7      | 2010-07-01 00:00:00 |
 |    8        |    2       |  Test_8      | 2010-08-01 00:00:00 |
 |    9        |    3       |  Test_9      | 2010-09-01 00:00:00 |
 -----------------------------------------------------------------

Выше приведен пример таблицы.Запущенный мной запрос должен вернуть данные следующим образом.

 -----------------------------------------------------------------
 | comment_id  |  user_id   | comment      |  date_time          |
 -----------------------------------------------------------------
 |    9        |    3       |  Test_9      | 2010-09-01 00:00:00 |
 |    8        |    2       |  Test_8      | 2010-08-01 00:00:00 |
 |    6        |    4       |  Test_6      | 2010-06-01 00:00:00 |
 -----------------------------------------------------------------

Наименьшее количество подзапросов, очевидно, будет лучше.Вполне возможно, что date_time может быть ниже для будущего комментария пользователя.

Это кажется простым, но оказывается довольно сложным ...

Ответы [ 2 ]

1 голос
/ 25 июня 2010

К сожалению, я не знаю синтаксис Doctrine, но могу дать вам решение в SQL. Этот SQL-запрос протестирован в MySQL, но также должен работать во многих других базах данных:

SELECT comment_id, user_id, comment, date_time
FROM comments
WHERE comment_id IN (
    SELECT MAX(comment_id) AS comment_id
    FROM comments T1
    JOIN
    (
        SELECT user_id, MAX(date_time) AS date_time
        FROM comments
        GROUP BY user_id
    ) T2
    ON T1.user_id = T2.user_id AND T1.date_time = T2.date_time
    GROUP BY T1.user_id, T2.date_time
)

Если кто-то еще хочет написать ответ для доктрины, он может использовать его в качестве отправной точки, если он поможет.

0 голосов
/ 25 июня 2010

Я не знаю о доктрине или MySQL, но использование кортежа в предложении IN может помочь:

select * from comments
where user_id, comment_id in
 (select user_id, max(comment_id)
  from comments
  group by user_id)
...