mysql group by year()的timestamp和foreign_id order by timestamp

时间:2017-10-25 07:30:44

标签: mysql group-by

我有一张像

这样的表格
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网关超时。 请帮我找到完成此任务的最佳解决方案。

2 个答案:

答案 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_timestampforeign_id。它可能会加快执行时间。 在mysql shell中尝试这样的事情:
`CREATE INDEX my_request ON my_table(foreign_id,some_timestamp);
有关索引的更多信息,请参阅here