2017-05-24 36 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