2010-06-24 77 views
1

好的,所以这是问题所在。目前我正在使用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 | 
----------------------------------------------------------------- 

最少量的子查询显然会更好。用户未来的评论可能会降低日期时间。

这似乎简单,但它被证明是相当困难...

+1

我不知道教义的语法,但我知道如何在ANSI SQL做到这一点这将在大多数数据库中工作。这对你有什么用处?或者,如果你在教义中需要它,也许你可以把它翻译成自己的教义? – 2010-06-24 20:32:54

+0

这是一个典型的“分组最大”问题或“每组最大”,如果你想要一个搜索词。 – 2010-06-24 20:34:42

回答

1

不幸的是我不知道学说的语法,但我可以给你在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

真棒标记!这个查询有诀窍。我还有其他3人来自我的团队,试图找出它,但没有成功。顺便说一句,您的网站已关闭...... – 2010-06-24 22:09:25

+0

因此,在尝试将此解决方案移植到教义后,实际上存在一个问题。在我的情况下,学说不会在JOIN中支持SELECT。有任何想法吗? – 2010-06-25 00:42:54

0

我不知道教义或MySQL,但使用IN子句的元组可以做的伎俩:

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