【问题标题】:Order By, Group By - Problems排序方式,分组方式 - 问题
【发布时间】:2010-06-24 20:30:29
【问题描述】:

好的,这就是问题所在。目前我正在使用 symfony 框架来开发一个网络应用程序。我在后端使用 MySQL,但希望将我的查询保持在他们的原则格式中,以避免在我需要更改数据库时出现任何问题。

在 Web 应用程序的一个部分中,我正在查找由任何不同用户关联的最后一条评论,按日期排序。可以有来自多个用户的多个 cmets 都在同一日期和时间,但此查询应仅获取基于日期的最后一条评论。

 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 可能会更低。

看起来很简单,但事实证明相当困难......

【问题讨论】:

  • 我不知道教义语法,但我知道如何在 ANSI SQL 中执行此操作,该操作适用于大多数数据库。那对你有用吗?或者,如果您在教义中需要它,也许您可​​以自己将其翻译成教义?
  • 如果你想要一个搜索词,这是一个典型的“groupwise maximum”问题或“greatest per group”。

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


【解决方案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
)

如果这里的其他人想为教义写一个答案,如果有任何帮助,欢迎他们以此为起点。

【讨论】:

  • 太棒了!这个查询成功了。我的团队中有 3 个其他人试图解决这个问题,但没有成功。顺便说一句,您的网站已关闭...
  • 因此,在尝试将此解决方案移植到学说之后,实际上存在一个问题。就我而言,原则不支持 JOIN 中的 SELECT。有什么想法吗?
【解决方案2】:

我不了解教义或 MySQL,但在 IN 子句中使用元组可能会奏效:

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

【讨论】:

    猜你喜欢
    • 2015-02-16
    • 2018-09-23
    • 2017-10-05
    • 2020-03-20
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    相关资源
    最近更新 更多