我花了几天时间尝试解决以下问题:假设我们已经解决了
表用户
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/