国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

groupBy和orderBy的替代方案

GeekGhc / 684人閱讀

摘要:一背景在開發的時候遇到一個需求,需要根據將數據分組,同時獲得每組數據中最新的一條數據。這種方法通過左關聯查詢,對笛卡爾積進行了篩選,就可以達到我們的目的。缺點對于數據量特別大的情況,如果沒有限制條件,得到的笛卡爾積會很大,所以查詢速度較慢。

一、背景

在開發的時候遇到一個需求,需要根據device_code將數據分組,同時獲得每組數據中最新的一條數據。

二、遇到的問題
2.1 最初的思路:先對數據進行orderBy 再進行groupBy
 sql語句:
 sql: SELECT * from y_device_events ORDER BY created_at DESC GROUP BY device_code

結果: 這種寫法會報錯,當groupBy和orderBy組合使用的時候,必須要先進性groupBy在進行orderBy。

2.2 進階思路:對數據進行orderBy的結果作為臨時表,再對臨時表分組
 sql語:
 sql:SELECT * from (SELECT * from y_device_events ORDER BY created_at DESC) as new_table GROUP BY new_table.device_code 

結果:這條語句執行了,但是結果并沒有按照預期的將最新的一條篩選出來

三、最終的解決方案
3.1 初級方案

通過之前兩種方案發現直接使用orderBy和groupBy并不能達到目的,最后覺得可以和自身作關聯查詢,通過關聯查詢進行篩選。

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

這種方法通過左關聯查詢,對笛卡爾積進行了篩選,就可以達到我們的目的。

3.2 缺點:對于數據量特別大的情況,如果沒有限制條件,得到的笛卡爾積會很大,所以查詢速度較慢。
3.3 最終的寫法

我的需求中可以加上對type及sub_type的限制,因此稍微可以加快一下數據的篩選,而且如果有數據篩選條件,可以將條件放入JOIN語句里面,而不是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"

加入篩選條件后,可以大大加快查詢的效率。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28977.html

相關文章

  • 寫一個“特殊”查詢構造器 - (五、聚合函數、分組、排序、分頁)

    摘要:聚合函數在中,有一些用來統計匯總的函數,被稱作聚合函數,如等。方法其它方法如之類的編寫就不一一展示了,代碼請看聚合函數。如何獲取總數當然是使用上面講到的聚合函數來處理。 where 相關的子句構造完成后,我們繼續構造其它子句。這一篇我們進行聚合函數、分組、排序等子句的構造。 聚合函數 在 SQL 中,有一些用來統計、匯總的函數,被稱作聚合函數,如 SUM、COUNT、AVG 等。 使用...

    iamyoung001 評論0 收藏0
  • Qone 正式開源,使 javascript 支持 .NET LINQ

    摘要:下一代查詢語言,使支持緣由最近剛好修改了騰訊文檔表格公式的一些,主要是修改公式的。總的來說,因為騰訊文檔公式相關工作早年的開發和開發,所以有了。讓前端工程師通過字符串的形式實現了的調用下面統一叫做,即組成的。多數據源多數據源會產生笛卡兒積。 Qone 下一代 Web 查詢語言,使 javascript 支持 LINQ Github: https://github.com/dntzha...

    JinB 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<