【问题标题】:Retrieving the last record in each group without primary key在没有主键的情况下检索每个组中的最后一条记录
【发布时间】:2016-10-08 12:08:22
【问题描述】:

我有一个表格来记录用户上次登录的详细信息

event_name userID value                  created_at
-------------------------------------------------------------
last_login 12    2016-06-02 11:06:29    2016-06-02 11:06:29 
last_login 12    2016-06-02 10:16:11    2016-06-02 10:16:11     
last_login 14    2016-06-02 10:11:13    2016-06-02 10:11:13     
last_login 17    2016-05-02 10:16:29    2016-05-02 10:16:29     
last_login 14    2016-05-02 10:15:11    2016-06-02 10:15:11     

预期结果:

event_name userID value                  created_at
-------------------------------------------------------------
last_login 12    2016-06-02 11:06:29    2016-06-02 11:06:29 
last_login 14    2016-06-02 10:11:13    2016-06-02 10:11:13     
last_login 17    2016-05-02 10:16:29    2016-05-02 10:16:29     

我想通过 UserId 获取此表信息组,我通过 created_at 对其进行排序并在 timesAgo fromat 中显示值(例如 1 小时前),但我没有获得有关使用 group by 的最新记录,例如,对于 userID = 12 I我得到价值 = 2016-06-02 10:16:11 而不是价值 = 2016-06-02 11:06:29

【问题讨论】:

  • 还要指定预期的结果!
  • 你的 SQL 查询是什么?
  • value 使用的 DB 数据类型是什么?
  • 值是varchar(512),因为我也在存储其他事件的值,而created_at is DATETIME
  • 为什么用户 14 的预期结果中使用的不是最高值?

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


【解决方案1】:

如果我理解正确,您可以通过NOT EXISTS() 实现这一点:

SELECT * FROM YourTable t
WHERE NOT EXISTS(SELECT 1 FROM YourTable s
                 WHERE s.created_at > t.created_at
                    AND s.userID = t.userID)

【讨论】:

  • 我想我没有说清楚自己的问题,我添加了预期的结果以更清楚我需要什么
  • 对不起,还是不明白,为什么一次选择最大的日期,一次选择最小的日期?! @KuldeepDangi
  • 记录按USERID分组
  • @KuldeepDangi 我的错,错字,现在试试
  • 它工作了 :) 谢谢,这个查询在数百万条记录上可以正常工作吗?还是为了性能我必须添加主键?
【解决方案2】:

试试这个。

首先我从 created_at 和 userID 中获取最大值,然后我加入以获取孔行

SELECT d.* FROM (
  SELECT 
      userID, MAX(created_at)  AS created_at
  FROM
      tablename 
  GROUP BY userID ) AS `keys`
LEFT JOIN tablename d ON 
  d.userID = `keys`.userID
  AND 
 d.created_at = `keys`.created_at;

示例

MariaDB []> SELECT d.* FROM (
    ->   SELECT
    ->       userID, MAX(created_at)  AS created_at
    ->   FROM
    ->       tablename
    ->   GROUP BY userID ) AS `keys`
    -> LEFT JOIN tablename d ON
    ->   d.userID = `keys`.userID
    ->   AND
    ->  d.created_at = `keys`.created_at;
+--------+----------------------------+
| userID | created_at                 |
+--------+----------------------------+
|      1 | 0000-00-00 00:00:00.000000 |
|      2 | 2016-06-03 13:16:07.000000 |
+--------+----------------------------+
2 rows in set (0.00 sec)

MariaDB []>

【讨论】:

  • 在 mysql 中运行此查询导致语法错误near AS keys
  • @Kuldeep Dangi - 抱歉 - 我的错误 - 首先:keys 是关键字,必须反引号或使用其他别名。第二:我忘记了 max(created_date) 的别名。我已经改变了我的答案。请再次测试 - 抱歉
猜你喜欢
  • 2010-11-21
相关资源
最近更新 更多