我有一张像
这样的表格create table `my_table`
(
`id` int auto_increment primary key,
`foreign_id` int not null,
`some_data` text,
`some_timestamp` timestamp default CURRENT_TIMESTAMP not null
);
我需要每年获得唯一的行(从timestap获得)和foreing_id,并从按时间戳排序的表中获取
我已经尝试过查询:
SELECT *
FROM (
SELECT *
FROM `my_table`
ORDER BY `some_timestamp` DESC) as lr
GROUP BY YEAR(lr.`some_timestamp`),lr.`foreign_id`;
但是这个没有按时间戳排序,idk为什么。
其他查询工作正常,直到我已将其加载到其他服务器:
SELECT * FROM `my_table`
WHERE `id`,`some_timestamp` IN
(
SELECT `id`,max(`some_timestamp`)
FROM `my_table` lr2
GROUP BY YEAR(lr2.`some_timestamp`),`lr2`.foreign_id
);
在我的电脑上这个查询执行大约3秒,在其他服务器上它得到错误504网关超时。 请帮我找到完成此任务的最佳解决方案。
答案 0 :(得分:1)
你让事情变得太复杂了。它没有正确排序,因为GROUP BY
在没有指定ORDER BY
的情况下进行隐式排序。
简单地这样做:
SELECT some_timestamp, foreign_id, MAX(some_timestamp) AS most_recent_timestamp_per_year
FROM `my_table`
GROUP BY YEAR(some_timestamp), foreign_id
ORDER BY `some_timestamp` DESC
我不确定,你最后的查询应该做什么。
另请注意,您未正确使用group by
select子句中的每一列都必须在group by子句中指定,或者应用聚合函数。否则,每组会得到随机行。
答案 1 :(得分:0)
要按日期订购此查询,您需要像下面这样重写:
SELECT *
FROM (
SELECT *
FROM `my_table`) as lr
GROUP BY YEAR(lr.`some_timestamp`),lr.`foreign_id`
ORDER BY YEAR(lr.`some_timestamp`) DESC;
关于第二次查询的执行时间。
如果您不想深入了解,请尝试将服务器数据库上的索引添加到列some_timestamp
和foreign_id
。它可能会加快执行时间。
在mysql shell中尝试这样的事情:
`CREATE INDEX my_request ON my_table(foreign_id,some_timestamp);
有关索引的更多信息,请参阅here