按顺序,分组依据 - 问题

时间:2010-06-24 20:30:30

标签: sql symfony1 greatest-n-per-group sql-order-by

好的,这就是问题所在。目前我正在使用symfony框架来开发一个Web应用程序。我在后端使用MySQL,但是如果我需要更改数据库,我希望以他们的学说格式保存我的查询以避免任何问题。

在Web应用程序的一个部分中,我正在查找由任何不同用户关联的最后一个注释,按日期排序。许多用户可以在同一日期和时间发出多条评论,但此查询应仅根据日期获取最后一条评论。

 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 个答案:

答案 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
)

如果这里有其他人想写一个学说的答案,欢迎他们将此作为起点,如果有任何帮助的话。

答案 1 :(得分:0)

我不知道doctrine或MySQL,但在IN子句中使用元组可能会有这个诀窍:

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