2017-05-24 35 views
0

我已经尝试了一些事情,但我最终混淆了自己。MySQL - 集团最新和加入一审

我想要做的是从表格中找到最近的记录,并在特定日期后加入第一条记录。

一个例子可能是

id | acct_no | created_at   | some_other_column 
1 | A0001 | 2017-05-21 00:00:00 | x 
2 | A0001 | 2017-05-22 00:00:00 | y 
3 | A0001 | 2017-05-22 00:00:00 | z 

所以非常想我是找到created_at DESC分类每个acct_no的最新记录,这样的结果是由独特的帐号从上面的记录分组,所以这将是3,但显然会有多个不同日期的记录的不同帐号。

然后,我试图实现的是加入同一张表,并在特定日期后找到具有相同帐号的第一条记录。

例如,记录1将被返回的查询接合上acct_noA0001后或等于2017-05-21 00:00:00,因为它是后的第一个结果/等于该日期,所以这些是由created_at ASC AND created_at >= "2017-05-21 00:00:00"(以及可能AND id != latest.id排序。

似乎相当简单,但我不能得到它的工作。

我只有我最近丢弃多个不同的查询后企图。

在这里,我想解决第一部分是选择最近的每个帐号:

SELECT latest.* FROM my_table latest 
JOIN (SELECT acct_no, MAX(created_at) FROM my_table GROUP 
BY acct_no) latest2 
ON latest.acct_no = latest2.acct_no 

但仍然返回所有行而不是每个最新的。

我确实在子查询中使用了连接,但在完成之前花了很长时间才运行它,但我在acct_nocreated_at上有索引,但我也遇到了其他问题,其中列中的不在群里。我知道这可以关闭,但我试图找到一种方法来执行不需要的查询。

+0

参见:[?为什么要我为了什么,在我看来是一个非常简单的SQL查询提供MCVE(https://meta.stackoverflow.com/questions/333952/why我应该改变我的答案,请检查它 – Strawberry

+0

但我得到多个结果为每个帐号而不是最近的? –

回答

1

刚刚试了一下修改您的初始查询:

SELECT latest.* FROM my_table latest 
join (SELECT acct_no, MAX(created_at) as max_time FROM my_table GROUP 
BY acct_no) latest2 
ON latest.acct_no = latest2.acct_no AND latest.created_at = latest2.max_time 
+0

啊,似乎工作,谢谢。这有点慢,但我为'acct_no'和'created_at'添加了一个多列索引来查看它是否更好。我只需要在特定的日期之后找出最近记录中的连接,但我想我知道如何做到这一点。 – martincarlin87

0

您需要获取创建最大日期的ID。

SELECT latest.* FROM my_table latest 
join (SELECT max(id) as id FROM my_table GROUP 
BY acct_no where created_at = MAX(created_at)) latest2 
ON latest.id = latest2.id 
+0

谢谢,刚刚尝试过它 - 我应该提供一个mcve为什么似乎对我来说是一个非常简单的sql查询) – martincarlin87

+0

从myTable中选择max(acct_no) GROUP BY created_at having created_at = max(created_at) –

+0

这是什么结果? –

0

尝试不同的方法。不确定性能影响。但希望避免自我加入和分组在性能方面会更好。

SELECT * FROM (
SELECT mytable1.*, IF(@temp <> acct_no, 1, 0) selector, @temp := acct_no FROM `mytable1` 
JOIN (SELECT @temp := '') a 
ORDER BY acct_no, created_at DESC , id DESC 
) b WHERE selector = 1 

Sql Fiddle