我觉得有一个简单的解决方案 - 我已经查看了Stack Overflow上的其他问题,但它们看起来效率低下,或者说我做错了。
以下是我正在使用的表的简化版本。
CREATE TABLE object_values (
object_value_id INT PRIMARY KEY,
object_id INT,
value FLOAT,
date_time DATETIME,
INDEX (object_id)
);
CREATE TABLE object_relations (
object_group_id INT,
object_id INT,
INDEX (object_group_id, object_id)
);
存在多对一关系 - 每个对象有很多对象值(每个对象平均150个对象值)
我想基于object_group_id获取每个object_id的最后一个对象值(由date_time字段确定)。
当前查询:
SELECT a.`object_id`, a.`value`
FROM `object_values` AS a
LEFT JOIN `object_relations` AS b
ON ( a.`object_id` = b.`object_id` )
WHERE b.`object_group_id` = 105
ORDER BY a.`date_time` DESC
这会拉回所有记录 - 如果我执行GROUP BY a。object_id
则会忽略ORDER BY
我尝试了一系列变化 - 我道歉,因为我知道这是一个常见的问题,但尝试其他解决方案到目前为止还没有完成。任何帮助都会非常感激。
有些解决方案在大约70秒后返回结果 - 这是一个大型系统,因此需要更快一些。
答案 0 :(得分:2)
SELECT a.object_id, a.`value`
FROM object_values a JOIN object_relations b
ON a.object_id = b.object_id
JOIN (
SELECT a.object_id, MAX(a.date_time) MaxTime
FROM object_relations b JOIN object_values a
ON a.object_id = b.object_id
WHERE b.`object_group_id` = 105
GROUP BY a.object_id
) g ON a.object_id = g.object_id AND a.date_time = g.MaxTime
WHERE b.`object_group_id` = 105
GROUP BY a.object_id
如果单个组中永远不会有GROUP BY
重复,则可以省略最终date_time
。
答案 1 :(得分:1)
尝试没有分组的此版本,使用子查询拉取每个对象的最大日期:
SELECT a.`object_id`, a.`value`
FROM `object_relations` b
JOIN `object_values` a
ON b.`object_id` = a.`object_id`
AND b.`object_group_id` = 105
WHERE a.`date_time` = (select MAX(date_time) from object_values where object_id = a.object_id)
由于您在where子句中指定了组ID,因此不需要左连接,因此我将该组作为连接中的主表。这可以通过几种方式完成。如果WHERE刚刚更改为AND,则子查询也可以移动到join子句。