mysql - 从多个表中组合选择每组的最大值

标签 mysql

我花了几天时间尝试解决以下问题:假设我们已经解决了

表用户

user_id, credit

表格属性

property_id, user_id, check_interval

tables states_(year)(即多个表 - 从 2010 年开始每年一个 - 即 states_2010 - 应用程序诞生时)

property_id, timestamp

背后的逻辑是每个用户都拥有一个或多个属性。每个属性都有一个或多个状态。截至时间戳为止已获得每个状态。状态每隔一定时间获取一次,即 check_interval (针对每个特定属性)。获取每个状态需要每个用户花费一个积分,该积分会从用户帐户(表用户)中扣除。

我的目标是从近期计划的检查开始,了解 property_ids 和下次检查的时间(每个 property_id 仅一次)。下一次检查的时间是最后一个状态的时间戳(即所有 states_(year) 表中的 max(timestamp))加上 check_interval。该概述应仅包含属于具有一定信用(即信用 > 0)的用户的属性的 property_id。

我发现了非常接近的问题( Get max row per group from a related table ),但它只涉及三个表,并且只能部分解决我的问题。就我而言,用户的信用和多个 states_(year) 表也很复杂,这是我无法打破的。

最佳答案

您可能想首先尝试使用 View 克服 state_[year] 困难。

CREATE VIEW super_states AS
SELECT property_id, `timestamp` FROM states_2013
UNION
SELECT property_id, `timestamp` FROM states_2012
UNION
SELECT property_id, `timestamp` FROM states_2011;

{根据需要继续}

然后尝试这个 SQL

SELECT properties.property_id
  , DATE_ADD(states.most_recent, properties.check_interval SECONDS) AS Next_Time
FROM properties
JOIN users
  ON properties.user_id = users.user_id
LEFT JOIN (SELECT property_id, MAX(timestamp) AS most_recent
           FROM super_states
           GROUP BY property_id) AS states
  ON states.property_id = properties.property_id
WHERE users.credit > 0;

反馈后编辑

第 1 步。检查 View - 看起来没问题吗?

SELECT * FROM super_states LIMIT 20;

第 2 步:检查显示每个属性的最新时间戳的子查询

SELECT property_id, MAX(`timestamp`) AS most_recent
FROM super_states
GROUP BY property_id;

第 3 步:尝试该解决方案的变体

SELECT properties.property_id
  , states.most_recent AS most_recent
  , properties.check_interval AS seconds_to_next_check
  , DATE_ADD(states.most_recent, properties.check_interval SECONDS) AS Next_Time
FROM properties
JOIN users
  ON properties.user_id = users.user_id
LEFT JOIN (SELECT property_id, MAX(`timestamp`) AS most_recent
           FROM super_states
           GROUP BY property_id) AS states
  ON states.property_id = properties.property_id
WHERE users.credit > 0;

关于mysql - 从多个表中组合选择每组的最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22669067/

相关文章:

mysql - 将不同的列合并为一列,然后按此排序

mysql - 访问被拒绝;您需要在 sql 查询浏览器中执行此操作的 super 权限

mysql - 查询输出为树 MySQL

mysql - SQL:如何连接表并将值放入单列中

mysql - 如何使用 Laravel 的流畅查询构建器选择计数?

mysql 触发器记录日志,查找更改的列

mysql - 根据跨多行的约束选择行

mysql - 我如何选择所有给定的员工 ID,即使是那些在另一个表中没有出现的员工 ID?

mysql - 结果字段显示空白值的情况

MYSQL 内部加入 2 个 ON 子句