好的,这就是问题所在。目前我正在使用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可能会更低。
看起来很简单,但证明相当困难......
答案 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)