中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么從LeetCode的題目再看MySQL Explain

發布時間:2021-10-22 09:47:38 來源:億速云 閱讀:139 作者:iii 欄目:數據庫

這篇文章主要講解了“怎么從LeetCode的題目再看MySQL Explain”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么從LeetCode的題目再看MySQL Explain”吧!

題目

題目描述:編寫一個 SQL 查詢,查找所有至少連續出現三次的數字。并且給了一個示例,阿粉按照題目給的示例在本地創建了 Logs  表和插入相應的數據,如下:

怎么從LeetCode的題目再看MySQL Explain

我們可以看到在給定上面的 Logs 表中, 1 是唯一連續出現至少三次的數字,所以最后輸出的結果是 1。

原始題目:LeetCode 180

剛看到題目的時候,阿粉一瞬間還是沒反應過來,不知道該如何著手進行,思索了一下考慮是否可以用自連接來實現呢?然后根據題目的意思就寫出了如下的  SQL。

SELECT DISTINCT  l1.num  FROM  `Logs` l1,  `Logs` l2,  `Logs` l3  WHERE  l1.num = l2.num   AND l2.num = l3.num   AND l1.id = l2.id - 1   AND l2.id = l3.id - 1

寫完過后阿粉第一次提交,提示下面錯誤,可以看到是最后沒有將返回重命名,調整了一下 SQL,就l1.num 改成l1.num as  ConsecutiveNums 再次提交,得到的第二張通過的圖。

怎么從LeetCode的題目再看MySQL Explain

怎么從LeetCode的題目再看MySQL Explain

看開始看到通過,阿粉還在想這道題也沒什么啊,還是 so easy 的嘛。但是突然阿粉轉念一想,這個題目說的是連續出現,并沒有說 ID 是連續的啊,如果  ID 不連續的話,這種就不對了,還有就是如果需要連續 4 次出現的,5 次出現的數字呢?總不能一直自連接下去吧。如果寫成這樣那整個 SQL  就太不靈活了。

隨后阿粉就看了一下官方解答以及相關評論,果不其然雖然官方給出的解答跟阿粉的一致,但是下面的評論卻有很多小伙伴都在說這個 ID 不連續的問題。

怎么從LeetCode的題目再看MySQL Explain

怎么從LeetCode的題目再看MySQL Explain

既然反饋這種做法有問題,那自然就會有好事之者會想到解決辦法,果然評論區的一個大佬給出了下面的這種解法

怎么從LeetCode的題目再看MySQL Explain

剛看到這個解法的時候,阿粉一下子沒有看懂,把這個代碼進行了提交,果然也是正常的通過了。而且這種解法不會被出現幾次的條件給限制。抱著學習的心態,阿粉準備研究一下這條  SQL 里面的內容。

SQL 拆解

首先這條 SQL 里面有這么幾個地方讓阿粉迷惑,第一個是@ 符號,然后是:= 然后還有個 case when then 語法,平日里在 CRUD  的時候沒遇到過這種寫法,不過不知道沒關系,Google 一下就好了。網上查了下,@prev 表示的是聲明變量,:=操作是 MySQL 的賦值操作,case  when then when 后面接的是判斷條件,條件成立則會返回then 后面的結果,需要注意的是 case  只會返回第一個符合條件的結果,剩下將會被忽略。

簡單的了解了上面幾個知識點過后,我們就可以對下面這條 SQL 進行拆解了。

select distinct Num as ConsecutiveNums from (   select Num,      case        when @currnet = Num then @count := @count + 1       when (@currnet := Num) is not null then @count := 1     end as CNT   from Logs, (select @currnet := null,@count := 0) as t ) as temp where temp.CNT >= 3
  1. 鴻蒙官方戰略合作共建——HarmonyOS技術社區

  2. 最外層的 select distinct Num as ConsecutiveNums from () as temp where temp.CNT  >= 3 ; 我們可以看到中間的小括號里面被派生成了一個臨時表,表名叫做 temp,并且 temp 表中有兩個字段分別是Num,CNT。其實Num  則是表Logs 里面的數字,CNT 則是連續出現的累積次數,最后的where temp.CNT >= 3 則是在根據要求連續出現的次數進行查詢。

  3. 派生語句SELECT Num,CASE WHEN @currnet=Num THEN @count:=@count+1 WHEN  (@currnet:=Num) IS NOT NULL THEN @count:=1 END AS CNT FROM LOGS,(SELECT  @currnet:=NULL,@count:=NULL) AS t 包含兩個部分,一個是Select 中的case when then 另一個是from 中的  (select @currnet:= null,@count := null) as t 其中select @currnet:= null,@count :=  null 也是一個派生表,這里通過聲明兩個變量@currnet, @count 并賦值為null 。

  4. 中間派生的表 temp 的內容如下,通過生成記錄每個數字出現的次數的臨時表來查詢數據。

怎么從LeetCode的題目再看MySQL Explain

下面我們通過explain 命令看下整個 SQL 的執行過程,:

怎么從LeetCode的題目再看MySQL Explain

  • 從select_type中我們可以看到總共派生了兩個表,跟我們上面分析的一致;

  • ID 為 3 的派生表的內容是select @current := null,@count := 0 定義兩個變量并賦值,并且 id  越大越先執行;

  • case 語句中第一個when 中判斷當前掃描到的 num 值與定義的變量是否一致,如果一致則 count 加一,不一致則進行下一個when  條件判斷,并將count 賦值為 1 返回;

  • 經過全表掃描過后,就得到了上面的中間表 temp 的內容;

不得不說,上面的方案是很完美的,不存在 ID 是否連續的問題,也不會多層自連接,而且也可以根據要求找出連續出現的次數,相對靈活。剛開始看到這個 SQL  的時候,阿粉并不清楚整個執行的過程,然后通過 explain 才漸漸明白整個執行過程, 而且對于在 SQL 中使用變量也有了一定的了解。

感謝各位的閱讀,以上就是“怎么從LeetCode的題目再看MySQL Explain”的內容了,經過本文的學習后,相信大家對怎么從LeetCode的題目再看MySQL Explain這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

铜鼓县| 嘉峪关市| 山东省| 肇东市| 湖南省| 宝鸡市| 元谋县| 兴宁市| 永定县| 陈巴尔虎旗| 温泉县| 永嘉县| 青河县| 万安县| 甘肃省| 兴文县| 高碑店市| 甘谷县| 屏东市| 四平市| 湖北省| 南溪县| 镇原县| 合作市| 梁平县| 镇巴县| 施甸县| 隆安县| 梧州市| 启东市| 长海县| 馆陶县| 湟源县| 博兴县| 庆安县| 荥经县| 铁力市| 普定县| 曲周县| 许昌县| 南充市|