[SQL ] select排序過的子表格 結果不同?
資料庫名稱: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
沒事當成子表格多 select 一次幹什麼?
當然是有理由的
起因是因為 PTT 的一篇文章
看板 Database
┌─────────────────────────────────────┐
│ 文章代碼(AID): #1O0O6zTK (Database) [ptt.cc] [SQL ] 兩張同性質Table找出 │
│ 文章網址: https://www.ptt.cc/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://www.ptt.cc/bbs/Database/M.1476518496.A.8E8.html
→
10/15 17:24, , 1F
10/15 17:24, 1F
是因為要解上一篇文章的題目才採用這種語法,所以 order by 沒有在最外面一層
或是有什麼其他更好的語法可以讓兩種不同結果的資料庫通吃? 我也很有興趣
→
10/15 17:29, , 2F
10/15 17:29, 2F
我文章中只有使用到「先把兩個子集合合併(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
→
10/15 19:11, , 3F
10/15 19:11, 3F
→
10/15 19:13, , 4F
10/15 19:13, 4F
^^^^^^^^
我會覺得? 很抱歉這不是我覺得,而是已經發生的事實
我文章內文有這麼一段:
資料庫的版本是
show variables like 'version';
+-----------------+ +--------------------------+
| Value | | Value |
+-----------------+ +--------------------------+
| 10.1.13-MariaDB | | 5.0.51b-community-nt-log |
+-----------------+ +--------------------------+
http://imgur.com/YfSymES
上面附了兩張圖,在原本的文章內容就有
現實擺在眼前
不是我覺得
而是某個版本的 MySQL (5.0.51b-community-nt-log)
他跑出來的結果就是:已經排序過的子集合,重新 select 後,排好的順序不會變
→
10/15 19:13, , 5F
10/15 19:13, 5F
→
10/15 19:14, , 6F
10/15 19:14, 6F
※ 編輯: chippclass (182.235.174.82), 10/15/2016 21:25:13
→
10/15 21:27, , 7F
10/15 21:27, 7F
→
10/15 21:28, , 8F
10/15 21:28, 8F
→
10/15 21:30, , 9F
10/15 21:30, 9F
→
10/15 21:32, , 10F
10/15 21:32, 10F
→
10/15 21:33, , 11F
10/15 21:33, 11F
→
10/15 21:34, , 12F
10/15 21:34, 12F
※ 編輯: chippclass (182.235.174.82), 10/15/2016 21:36:58
→
10/15 21:34, , 13F
10/15 21:34, 13F
→
10/15 21:36, , 14F
10/15 21:36, 14F
→
10/15 21:36, , 15F
10/15 21:36, 15F
→
10/15 21:40, , 16F
10/15 21:40, 16F
→
10/30 23:04, , 17F
10/30 23:04, 17F
Database 近期熱門文章
PTT數位生活區 即時熱門文章