【发布时间】:2018-06-18 12:19:30
【问题描述】:
我有一个以下模式的表:
+----+--------+----------------------------+----------------------------+
| id | amount | created_timestamp | updated_timestamp |
+----+--------+----------------------------+----------------------------+
| 1 | 1.00 | 2018-01-09 12:42:38.973222 | 2018-01-09 12:42:38.973222 |
+----+--------+----------------------------+----------------------------+
这里,对于id = 1,可能有多个金额条目。我想提取最后添加的条目及其对应的数量,按 id 分组。
我在 self 表上编写了一个带有内部联接的工作查询,如下所示:
SELECT t1.id,
t1.amount,
t1.created_timestamp,
t1.updated_timestamp
FROM transactions AS t1
INNER JOIN (SELECT id,
Max(updated_timestamp) AS last_transaction_time
FROM transactions
GROUP BY id) AS latest_transactions
ON latest_transactions.id = t1.id
AND latest_transactions.last_transaction_time =
t1.updated_timestamp;
我认为内部连接是一种矫枉过正,可以用更优化/更高效的查询来代替。我用where、group by 和having 编写了以下查询,但它不起作用。有人可以帮忙吗?
select id, any_value(`updated_timestamp`), any_value(amount) from transactions group by `id` having max(`updated_timestamp`);
【问题讨论】:
-
这就是你在 MySQL 中的做法:
-
您的意思是使用内部连接,这是最有效的方法?
-
是的,在 MySQL 中我认为没有更好的方法。
-
你有
(id,updated_timestamp)的索引吗?你的主键是什么(假设不是(id,updated_timestamp)) -
所以,没有主键。但是
id和updated_timestamp上有单独的索引
标签: mysql group-by query-optimization greatest-n-per-group groupwise-maximum