Database 板


LINE

資料庫名稱:MariaDB , MySQL 資料庫版本:10.1.13-MariaDB , 5.0.51b-community-nt-log 內容/問題描述: 雖然標題是: [SQL ] select排序過的子表格 結果不同? 可是剩下的字數不夠我打出完整的意思,所以被簡化成那樣 完整的標題,我會想這樣打: 同樣的資料跟同樣的語法下 MariaDB 和 MySQL,去 select 一個已經排序過的子表格 產生出來的資料結果是不同的? 以下文章 是先打好在自己個人版上,然後再複製過來的 今天意外發現 MariaDB 跟以往我用的 MySQL 有不同的地方 來個文章記錄一下吧 MariaDB 和 MySQL,兩者之間的關聯性 把這兩個資料庫的名字丟去 Google 查 大概可以知道的就是創辦人是一樣的 然後 MySQL 被 Sun 買下來了,所以新推出 MariaDB MariaDB 號稱可以完全相容於 MySQL 以上是我網路上查到的文章 在沒有得到反駁方的相關文章之前 就先以這些文章都是正確的前提下,來探討這兩個資料庫 而既然兩者是該完全相容的 所以如果出現相同的情況下卻有不同的處理方法 那我覺得是大事 因為這表示要是哪天要從 MySQL 換成 MariaDB 本來以為可以無痛升級 卻出現了沒想到的 Bug ? 首先來建立一個表格,然後放一些測試用的假資料進去 兩個資料庫都做這個動作 create table b ( `b1` char(1) , `b2` char(2) , `b3` char(3) ); insert into b (b1,b2,b3) values ('B','B4','/14'), ('F','B3','/05'), ('G','B5','/10'), ('A','B5','/11'); 有了這表格後,接著把資料用最基本的語法叫出來 select * from b; +------+------+------+ | b1 | b2 | b3 | +------+------+------+ | B | B4 | /14 | | F | B3 | /05 | | G | B5 | /10 | | A | B5 | /11 | +------+------+------+ b1欄位可以看到 B,F,G,A 是在新增資料進去時的原始排序 如果抓資料出來時對 b1 欄位做排序 select * from b order by b1 desc ; +------+------+------+ | b1 | b2 | b3 | +------+------+------+ | G | B5 | /10 | | F | B3 | /05 | | B | B4 | /14 | | A | B5 | /11 | +------+------+------+ b1欄位就變成由大到小的逆向排序 G,F,B,A 到此為止兩邊會是一樣的 但是如果把這個抓出來的資料當成子表格 再度 select 一次 MariaDB 和 MySQL 就會產生不同的結果 select * from (select * from b order by b1 desc)tb1; +------+------+------+ +------+------+------+ | b1 | b2 | b3 | | b1 | b2 | b3 | +------+------+------+ +------+------+------+ | B | B4 | /14 | | G | B5 | /10 | | F | B3 | /05 | | F | B3 | /05 | | G | B5 | /10 | | B | B4 | /14 | | A | B5 | /11 | | A | B5 | /11 | +------+------+------+ +------+------+------+ 資料庫的版本是 show variables like 'version'; +-----------------+ +--------------------------+ | Value | | Value | +-----------------+ +--------------------------+ | 10.1.13-MariaDB | | 5.0.51b-community-nt-log | +-----------------+ +--------------------------+ http://imgur.com/YfSymES http://imgur.com/HRdKxYx 沒事當成子表格多 select 一次幹什麼? 當然是有理由的 起因是因為 PTT 的一篇文章 看板 Database ┌─────────────────────────────────────┐ │ 文章代碼(AID): #1O0O6zTK (Database) [ptt.cc] [SQL ] 兩張同性質Table找出 │ │ 文章網址: https://webptt.com/m.aspx?n=bbs/Database/M.1476493757.A.754.html │ │ 這一篇文章值 132 Ptt幣 │ └─────────────────────────────────────┘ 6675 10/15 s1237890210 □ [SQL ] 兩張同性質Table找出相同資料較新的一筆 內文如下: -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 內容/問題描述: Lot在不同廠區作業,希望能列出每一筆Lot的最新一筆停留站點, 不一定每筆Lot都會同時存在兩張Table內, 目前的作法是先Union All後用時間排序,用迴圈跑取不重複的資料出來, 應該要有辦法直接Select出來,請賜教了<(_ _)> Table A Table B ------------------------------- ------------------------------ LotID LastStep LastStepTime LotID LastStep LastStepTime A Astep3 2016/10/15 B Bstep4 2016/10/14 B Astep3 2016/10/13 F Bstep3 2016/10/05 C Astep1 2016/10/14 G Bstep5 2016/10/10 D Astep2 2016/10/13 A Bstep5 2016/10/11 ------------------------------- ------------------------------ 希望得到的查詢結果: LotID LastStep LastStepTime ------------------------------- A Astep3 2016/10/15 B Bstep4 2016/10/14 C Astep1 2016/10/14 D Astep2 2016/10/13 F Bstep3 2016/10/05 G Bstep5 2016/10/10 ------------------------------- -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- 內文結束 想說來試著解題看看 如果不要抓資料回去再用 php 或是 asp.net 或是 其他任何的主機端的語言來處理 要直接用一個 SQL 語法找出所需的資料的話 把抓到的資料當成子表格處理三次可以得到解 雖然不知道是不是個好方法,但是目前我想到可以這樣做 但是實際在操作一次驗證可不可行時 在我電腦上的 MariaDB 一直無法測試成功 無法取出最大值讓我覺得很奇怪,卻又抓不不出 Bug 後來換了別台電腦後就成功了 使用線上sql工具,選 MySQL 5.6 版本也是成功的 這個線上sql工具目前似乎是沒有 MariaDB 可以選 所以就發現了 MariaDB 和 MySQL 兩者處理方式的不同 「可能可以用」的解法 http://sqlfiddle.com/#!9/758ad/3 不清楚這是不是 MariaDB 在規格文件上有提到的變更? 又或者是? 其他的可能性? 總之先記下來提醒自己有這件事吧 - 這個結果是今天自己意外發現的 當然也有可能其實是我... 後知後覺?已知用火? 如果遇到這種結果不同的情形時,採用哪一種方式做可能會比較好? 1. 永遠不要換資料庫? 2. 不要用這種 sql 語法,避免以後升級資料庫出問題? 3. 其他? -- ▁ ◢ ▄▄▄▄▄▄▄ . * ▁▁ 狼出沒注意! . ˊ . ▅▂ ▂▅ ◢◤ ▄▄▄▄▄▄▄ . ▃▂▁ http://chippclass.99k.org/↙◆ ▇▇ telnet://bs2.to (P_chippclass)↙◆ ▆▅▂ ψchippclass ▅▂▁ --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 182.235.174.82
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Database/M.1476518496.A.8E8.html
1F:→ iFEELing: ORDER BY 不是應該要下在最外面那層嗎? 10/15 17:24
是因為要解上一篇文章的題目才採用這種語法,所以 order by 沒有在最外面一層 或是有什麼其他更好的語法可以讓兩種不同結果的資料庫通吃? 我也很有興趣
2F:→ iFEELing: 在子集合裡排序然後兩個子集合拼起來的時候還是會亂掉吧 10/15 17:29
我文章中只有使用到「先把兩個子集合合併(union, not join) ,然後再排序」 你說的情形「子集合排序然後再合拼起來」並不在我的這篇文章中有出現過 所以我不清楚你在說哪一件事 ※ 編輯: chippclass (182.235.174.82), 10/15/2016 18:55:44 ※ 編輯: chippclass (182.235.174.82), 10/15/2016 18:58:31
3F:→ iFEELing: select * from (select * from b order by b1 desc)tb1; 10/15 19:11
4F:→ iFEELing: 不太曉得為什麼你會覺得在SUB QUERY裡面排序之後 10/15 19:13
^^^^^^^^ 我會覺得? 很抱歉這不是我覺得,而是已經發生的事實 我文章內文有這麼一段: 資料庫的版本是 show variables like 'version'; +-----------------+ +--------------------------+ | Value | | Value | +-----------------+ +--------------------------+ | 10.1.13-MariaDB | | 5.0.51b-community-nt-log | +-----------------+ +--------------------------+ http://imgur.com/YfSymES http://imgur.com/HRdKxYx 上面附了兩張圖,在原本的文章內容就有 現實擺在眼前 不是我覺得 而是某個版本的 MySQL (5.0.51b-community-nt-log) 他跑出來的結果就是:已經排序過的子集合,重新 select 後,排好的順序不會變
5F:→ iFEELing: 再SELECT一次出來就一定是原本的順序... 10/15 19:13
6F:→ iFEELing: 至少我自己的理解是要下ORDER BY的對象是最終的結果集.. 10/15 19:14
※ 編輯: chippclass (182.235.174.82), 10/15/2016 21:25:13
7F:→ iFEELing: 喔 所以你的問題是覺得Maria跟MySQL應該要100%一樣? 10/15 21:27
8F:→ iFEELing: 某一個DBMS這樣做不代表其他的DBMS也會這麼做吧 10/15 21:28
9F:→ iFEELing: 如果這不是標準規定的行為 甚至同DBMS不同版本也會不同 10/15 21:30
10F:→ iFEELing: 還是說你覺得號稱相容就要連全部行為都100%一樣? 10/15 21:32
11F:→ iFEELing: 我自己的理解是ORDER BY是對結果集排序 10/15 21:33
12F:→ iFEELing: 然後你最外層的SELECT是沒有指定ORDERBY的 這樣會怎麼 10/15 21:34
※ 編輯: chippclass (182.235.174.82), 10/15/2016 21:36:58
13F:→ iFEELing: 排就要看DBMS在處理中間資料集的時候實作的程序是怎樣 10/15 21:34
14F:→ iFEELing: 比如處理的時候用HASH或平行 都有可能不是循序的 10/15 21:36
15F:→ iFEELing: 所以如果你要確定最後的結果是有排好的 應該在最外層排 10/15 21:36
16F:→ iFEELing: 不過既然你覺得這是BUG 那或許可以開問題給MARIA看看... 10/15 21:40
17F:→ duolala: 印象中,MSSQL也有此現象呀 10/30 23:04







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP