【问题标题】:SQL does not order and groupSQL 不排序和分组
【发布时间】:2020-04-16 14:55:03
【问题描述】:

我正在编写这个 SQL 查询来检测最近登录系统的用户。我现在的查询:

SELECT * FROM (
    SELECT * FROM events WHERE eventName = 'Login' ORDER BY eventID DESC
) AS SUBQUERY 
GROUP BY personID;

这是我要读取的原始表格:

+---------+----------+-----------+--------------+----------------------------+
| eventID | personID | eventName | eventContent | timeStamp                  |
+---------+----------+-----------+--------------+----------------------------+
|       1 |        2 | Login     | Login        | On: 26/12/2019 at 16:53:34 |
|       2 |        2 | Click     | Button       | On: 26/12/2019 at 16:53:42 |
|       3 |        1 | Login     | Login        | On: 26/12/2019 at 16:53:43 |
|       4 |        1 | Login     | Login        | On: 26/12/2019 at 16:59:22 |
|       5 |        0 | Login     | Login        | On: 26/12/2019 at 17:4:34  |
|       6 |        1 | Login     | Login        | On: 26/12/2019 at 17:5:6   |
+---------+----------+-----------+--------------+----------------------------+

我期待的输出:

ID  Login Time
1   On: 26/12/2019 at 17:5:6
0   On: 26/12/2019 at 17:4:34
2   On: 26/12/2019 at 16:53:34

输出 SQL 给我:

ID  Login Time
0   On: 26/12/2019 at 17:4:34
1   On: 26/12/2019 at 16:53:43
2   On: 26/12/2019 at 16:53:34

【问题讨论】:

  • 找出你正在使用的RDBMS,然后查看meta.stackoverflow.com/questions/333952/…
  • 您应该包含一些示例数据和您期望的结果,选择 * 非常危险,尤其是在我们不了解您的架构的论坛中
  • 如果您的样本数据能够代表您的实际数据,那么您获得可用答案的机会就更大。由于示例不包含列 eventName、eventID 或 personid,并且发布的日期不是 mysql 日期格式,它们是文本吗?..
  • 我已经从头开始编辑这个问题来解释最好的。查看修改后的问题@ChrisSchaller
  • 我已经从头开始编辑这个问题来解释最好的。查看修改后的问题@P.Salmon

标签: mysql sql mariadb greatest-n-per-group


【解决方案1】:

我了解您需要最新的LoginTimeID

只涉及两列,您可以使用聚合:

select personID ID, max(timestamp) LoginTime from mytable group by personID

如果由于某种原因您需要表中的更多列,则可以使用相关子查询进行过滤:

select t.*
from mytable t
where t.timestamp = (
    select max(t1.timestamp) from mytable t1 where t1.personID = t.personID
)

【讨论】:

  • 谢谢!在我将时间戳更改为更合适的格式后,您的解决方案有效!
【解决方案2】:

因为您的ORDER 语句在内部子查询上,所以它对最终选择有ZERO 影响。

相反,您应该将ORDER BY 语句移到分组语句之外...

我不得不质疑你为什么要使用子查询,使用select *GROUP BY会从组中返回一条记录是正确的,在其他RDBMS中这种类型的查询是无效的,我们必须指定要返回的特定字段,包括用于不属于分组语句的列的任何聚合表达式。

【讨论】:

  • 如果提供更多信息,包括预期输出,我可以更新此解决方案以包含 SQL 语句,但如果没有更多信息,我无法轻易猜出有助于 OP 的正确语法。
  • 等一下,我会帮你处理好事情的
猜你喜欢
  • 1970-01-01
  • 2018-01-29
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
相关资源
最近更新 更多