摘要:一背景在開(kāi)發(fā)的時(shí)候遇到一個(gè)需求,需要根據(jù)將數(shù)據(jù)分組,同時(shí)獲得每組數(shù)據(jù)中最新的一條數(shù)據(jù)。這種方法通過(guò)左關(guān)聯(lián)查詢(xún),對(duì)笛卡爾積進(jìn)行了篩選,就可以達(dá)到我們的目的。缺點(diǎn)對(duì)于數(shù)據(jù)量特別大的情況,如果沒(méi)有限制條件,得到的笛卡爾積會(huì)很大,所以查詢(xún)速度較慢。
一、背景
在開(kāi)發(fā)的時(shí)候遇到一個(gè)需求,需要根據(jù)device_code將數(shù)據(jù)分組,同時(shí)獲得每組數(shù)據(jù)中最新的一條數(shù)據(jù)。
二、遇到的問(wèn)題sql語(yǔ)句: sql: SELECT * from y_device_events ORDER BY created_at DESC GROUP BY device_code
結(jié)果: 這種寫(xiě)法會(huì)報(bào)錯(cuò),當(dāng)groupBy和orderBy組合使用的時(shí)候,必須要先進(jìn)性groupBy在進(jìn)行orderBy。
sql語(yǔ): sql:SELECT * from (SELECT * from y_device_events ORDER BY created_at DESC) as new_table GROUP BY new_table.device_code
結(jié)果:這條語(yǔ)句執(zhí)行了,但是結(jié)果并沒(méi)有按照預(yù)期的將最新的一條篩選出來(lái)
三、最終的解決方案通過(guò)之前兩種方案發(fā)現(xiàn)直接使用orderBy和groupBy并不能達(dá)到目的,最后覺(jué)得可以和自身作關(guān)聯(lián)查詢(xún),通過(guò)關(guān)聯(lián)查詢(xún)進(jìn)行篩選。
SELECT `y_device_events`.* FROM `y_device_events` LEFT JOIN `y_device_events` AS `new_table` ON `y_device_events`.`device_code` = `new_table`.`device_code` AND `y_device_events`.`created_at` < `new_table`.`created_at` WHERE `new_table`.`created_at` IS NULL
這種方法通過(guò)左關(guān)聯(lián)查詢(xún),對(duì)笛卡爾積進(jìn)行了篩選,就可以達(dá)到我們的目的。
我的需求中可以加上對(duì)type及sub_type的限制,因此稍微可以加快一下數(shù)據(jù)的篩選,而且如果有數(shù)據(jù)篩選條件,可以將條件放入JOIN語(yǔ)句里面,而不是join完成的where里
SELECT `y_device_events`.* FROM `y_device_events` LEFT JOIN `y_device_events` AS `new_table` ON `y_device_events`.`device_code` = `new_table`.`device_code` AND `y_device_events`.`created_at` < `new_table`.`created_at` AND `y_device_events`.`type` = `new_table`.`type` AND `y_device_events`.`sub_type` = `new_table`.`sub_type` AND `y_device_events`.`type` = `2` AND `y_device_events`.`sub_type` = `1` WHERE `new_table`.`created_at` IS NULL AND `y_device_events`.`created_at` > "2018 - 07 - 05 10 : 07 : 27" AND `y_device_events`.`created_at` < "2018 - 07 - 05 11 : 04 : 27" AND `y_device_events`.`result_code` = "-1"
加入篩選條件后,可以大大加快查詢(xún)的效率。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/28977.html
摘要:聚合函數(shù)在中,有一些用來(lái)統(tǒng)計(jì)匯總的函數(shù),被稱(chēng)作聚合函數(shù),如等。方法其它方法如之類(lèi)的編寫(xiě)就不一一展示了,代碼請(qǐng)看聚合函數(shù)。如何獲取總數(shù)當(dāng)然是使用上面講到的聚合函數(shù)來(lái)處理。 where 相關(guān)的子句構(gòu)造完成后,我們繼續(xù)構(gòu)造其它子句。這一篇我們進(jìn)行聚合函數(shù)、分組、排序等子句的構(gòu)造。 聚合函數(shù) 在 SQL 中,有一些用來(lái)統(tǒng)計(jì)、匯總的函數(shù),被稱(chēng)作聚合函數(shù),如 SUM、COUNT、AVG 等。 使用...
摘要:下一代查詢(xún)語(yǔ)言,使支持緣由最近剛好修改了騰訊文檔表格公式的一些,主要是修改公式的??偟膩?lái)說(shuō),因?yàn)轵v訊文檔公式相關(guān)工作早年的開(kāi)發(fā)和開(kāi)發(fā),所以有了。讓前端工程師通過(guò)字符串的形式實(shí)現(xiàn)了的調(diào)用下面統(tǒng)一叫做,即組成的。多數(shù)據(jù)源多數(shù)據(jù)源會(huì)產(chǎn)生笛卡兒積。 Qone 下一代 Web 查詢(xún)語(yǔ)言,使 javascript 支持 LINQ Github: https://github.com/dntzha...
閱讀 1135·2021-10-27 14:15
閱讀 2842·2021-10-25 09:45
閱讀 2025·2021-09-02 09:45
閱讀 3414·2019-08-30 15:55
閱讀 1883·2019-08-29 16:05
閱讀 3292·2019-08-28 18:13
閱讀 3157·2019-08-26 13:58
閱讀 502·2019-08-26 12:01