背景:task表中保存有車的代辦工單的數據,由於歷史緣由,該數據表中保存有同一個車同一個status的多條數據,如今須要將歷史數據都刪掉,只保留同一個車同一個狀態下的最新一條記錄便可,那麼這個sql該怎麼寫呢?sql
實現這個需求,咱們先要了解幾個MySQL的函數:函數
第一個函數是group by和group_concat。group_concat的做用是將group by產生的同一個分組中的值鏈接起來,返回一個字符串結果。由於咱們是想獲取非最新的數據id,而後根據id將數據進行刪除。咱們能夠結合group_concat和order by實現目的,固然order by不是放在where以後,而是放在group_concat的括號裏面(此處若是放在where的後面,是沒有排序效果的)。blog
第二個函數,若是有字符串是123,456,789,若是我想獲取第一個逗號之後的內容,該怎麼辦,這時候咱們要用到LOCATE和SUBSTRING函數,例如:SELECT SUBSTRING('123,456,789',LOCATE(',','123,456,789')+1),結果爲456,789。補充一下,若是想獲取逗號以前的內容能夠使用SUBSTRING_INDEX函數,示例爲:SELECT SUBSTRING_INDEX('111,222,333,444,555,666',',',3),結果爲獲取第三個逗號以前的內容,即111,222,333排序
下面開始整合sql:字符串
SELECT
SUBSTRING(GROUP_CONCAT(id ORDER BY created_at DESC), LOCATE(',', GROUP_CONCAT(id ORDER BY created_at DESC)) + 1) AS ids,
GROUP_CONCAT(id ORDER BY created_at DESC) AS groupIds, GROUP_CONCAT(created_at) AS groupCreatedAt,
carId, COUNT(*) AS num
FROM
task
WHERE
type = 410 AND is_deleted = 0 AND status = 11
GROUP BY
carId
HAVING
num > 1
ORDER BY id ASCim
結果集ids即排除了最新一條數據id,剩下咱們將要刪除的ids,直接根據id執行刪除操做就能夠了。數據