【问题标题】:MySQL query to fetch most recent recordMySQL查询以获取最新记录
【发布时间】:2011-10-26 23:23:58
【问题描述】:

我有四张桌子。这些表的结构如下图所示(我只展示了相关的列名)。

User (user_id)
User_RecordType (user_id, recordType_id)
RecordType (recordType_id)
Record (recordType_id, record_timestamp, record_value)

我需要为给定用户有权访问的每个RecordType 找到最新的record_value。时间戳存储为自纪元以来的秒数。

我可以通过查询获得用户可以访问的 RecordTypes:

SELECT recordType_id 
FROM User, User_RecordType, RecordType 
WHERE User.user_id=User_RecordType.user_id 
AND User_RecordType.recordType_id=RecordType.recordType_id;

这个查询没有做的是还为用户有权访问的每个 RecordType 获取最新的 Record。理想情况下,我希望在一个查询中完成所有这些操作,并且不使用任何存储过程。

那么,有人可以借给我一些他们的 SQL-fu 吗?谢谢!

【问题讨论】:

  • 我添加了greatest-n-per-group 标签。这个问题在 StackOverflow 上已经回答了几十次了。跟随标签。

标签: mysql join greatest-n-per-group


【解决方案1】:
SELECT
  Record.recordType_id,
  Record.record_value
FROM
  Record
INNER JOIN
  (
  SELECT
    recordType_id,
    MAX(record_timestamp) AS `record_timestamp`
  FROM
    Record
  GROUP BY
    recordType_id
  ) max_values
ON
  max_values.recordType_id = Record.recordType_id 
AND 
  max_values.record_timestamp = Record.record_timestamp
INNER JOIN
  User_RecordType
ON
  UserRecordType.recordType_id = RecordType.recordType_id
WHERE
  User_RecordType.user_id = ?

【讨论】:

  • 如果 Record 表中的 recordType_id 列是唯一的,我们不需要AND max_values.record_timestamp = Record.record_timestamp 条件,对吧?
  • 如果是这样,那你为什么要问“最近的记录值”,“为每个记录类型获取最近的记录”并谈论时间戳?这意味着每个记录类型有多个记录...请决定!
  • 对不起,丹,你说得对。我将recordType_id 列与record_id 列混淆了。我的错。您的解决方案运行良好——非常感谢。
猜你喜欢
  • 2012-01-12
  • 2016-10-15
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多