iT邦幫忙

2

MySQL 同一資料表的查詢語法

各位mysql高手,小弟來這邊請教一個問題,稿不出來...
/images/emoticon/emoticon02.gif
資料表如下圖,

皆為同一個資料表
主鍵(sn)1、2、3、4
訂單三筆(orders_sn) 1、2、3
訂單狀態(status_sn)他有 ""失敗時"" status_sn=3
我就不抓取那筆訂單
所以我只會抓取到
主鍵 1 、4

用in我成功的抓取到了。
select * from aa where orders_sn not in ( select orders_sn from aa where status_sn='3' );

但我考慮到往後的效率問題。
exists 要怎寫呢?或join?

https://ithelp.ithome.com.tw/upload/images/20180124/20105022Cik4lXMk6e.jpg

附上資料表

CREATE TABLE `aa` (
  `sn` int(11) NOT NULL,
  `file_sn` int(10) NOT NULL,
  `orders_sn` int(10) NOT NULL,
  `status_sn` int(10) NOT NULL COMMENT '0等待中 1成功 2處理中 3失敗 '
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

INSERT INTO `aa` (`sn`, `file_sn`, `orders_sn`, `status_sn`) VALUES
(1, 1, 2, 1),
(2, 1, 1, 3),
(3, 1, 1, 1),
(4, 1, 3, 1);

ALTER TABLE `aa`  ADD PRIMARY KEY (`sn`);

ALTER TABLE `aa`  MODIFY `sn` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
看更多先前的討論...收起先前的討論...
別的不說
您是我這幾年來看過
發問 SQL 問題問的最有誠意的
已點讚
石頭 iT邦高手 1 級 ‧ 2018-01-24 09:01:42 檢舉
>海綿寶寶 真的!!
這是我第一次看到有附圖和table schema的發問者
其實在上萬筆以上時,就會開始計算越來越久@@
exists效率最差= =...
謝謝各位^^",那大至上用那一種方法,效率計算會比較好呢?!
pupuliao iT邦新手 5 級 ‧ 2018-01-25 11:30:54 檢舉
抱歉 看不董 你是要搜尋那些資料? 如果只是不要失敗的訂單 直接用 status_sn!='3' 不就可以了嗎?
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
石頭
iT邦高手 1 級 ‧ 2018-01-24 08:17:07
最佳解答

not exists 寫法

select * from aa as a1 
where not exists
(select 1 from aa as a2 where a2.status_sn='3' and a2.orders_sn = a1.orders_sn);

執行結果

如果要使用Join 可先將排除資料撈出來塞入Temp table在將原本的表join temp table
來塞選資料

這篇文章在比較 NOT IN,NOT EXISTS,LEFT JOIN效能差異 連結

0
I code so I am
iT邦高手 1 級 ‧ 2018-01-25 10:32:24

如果要一句寫完,可能只有用 subquery,如果考慮 performance,個人建議兩種方式:

  1. 使用 stored procedure, 利用 cursor 判斷每一筆資料。
  2. 將表格拆成兩個 Table,一個專門記錄 status <> 3 的 orders_sn。

我要發表回答

立即登入回答