2010-06-24 5 views
1

Хорошо, вот и проблема. В настоящее время я использую структуру 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 может быть ниже для будущего комментария пользователя.

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

+1

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

+0

И это типичная проблема «группового максимума» или «наибольшая для каждой группы», если вы хотите использовать поисковый запрос. –

ответ

1

К сожалению, я не знаю синтаксис 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

Awesome Mark! Этот запрос сделал трюк. У меня было 3 других человека из моей команды, которые пытались это выяснить, но не увенчались успехом. BTW, ваш сайт не работает ... –

+0

Итак, после попытки переноса этого решения в доктрину на самом деле есть одна проблема. В моем случае доктрина не поддерживает SELECT в JOIN. Есть идеи? –

0

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

select * from comments 
where user_id, comment_id in 
(select user_id, max(comment_id) 
    from comments 
    group by user_id) 
Смежные вопросы