# WHERE IN + 子查詢 改成 JOIN 小技巧 ###### tags: `DB` 假設有個訂單 Table DetailOrder,裡頭紀錄了多筆小訂單,資料是照建立時間排序的,另外每筆小訂單都有關聯到一個整合的主單(`main_no`),主單成立時間為第一筆小訂單建立時間,需求是要統計某個主單成立時間時段內,小訂單的數量總和 | id | main_no | created_time | amount | |--------| --------| --------| --------| | 1 | main-1 | 1739000000 | 10 | | 2 | main-2 | 1739000010 | 20 | | 3 | main-1 | 1739000020 | 30 | | 4 | main-2 | 1739000030 | 40 | | 5 | main-3 | 1739000040 | 50 | | 6 | main-1 | 1739000050 | 60 | | 7 | main-1 | 1739000060 | 70 | | 8 | main-1 | 1739000061 | 80 | | 9 | main-3 | 1739000062 | 90 | ## 情境 假設查詢時段為 1739000000 ~ 1739000060,如果直接使用 `created_time` 去查 ```sql SELECT COUNT(id) AS num FROM DetailOrder WHERE created_time BETWEEN 1739000000 AND 1739000060 ``` 如上面 Table 資料,上述 SQL 會漏掉 `id = 8` 跟 `id = 9` 的小訂單。因此,必須先把查詢時段的主單編號(`main_no`)搜出來,再根據主單編號(`main_no`)統計小訂單數量才會準確: ### WHERE IN + 子查詢 最直觀的方式,使用 WHERE IN + 子查詢達成 ```sql SELECT COUNT(id) AS num FROM DetailOrder WHERE main_no IN ( SELECT DISTINCT main_no FROM DetailOrder WHERE created_time BETWEEN 1739000000 AND 1739000060 ) ``` ### JOIN JOIN 方式通常會比 WHERE IN 更快 ```sql SELECT COUNT(do1.id) AS num FROM DetailOrder AS do1 JOIN ( SELECT DISTINCT main_no FROM DetailOrder WHERE created_time BETWEEN 1739000000 AND 1739000060 ) AS do2 ON do1.main_no = do2.main_no; ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up