[MySQL]多表關聯查詢技巧

示例表A:sql

author_id author_name
1 Kimmy
2 Abel
3 Bill
4 Berton

示例表B:函數

book_id author_id start_date end_date
9 1 2017-09-25 21:16:04 2017-09-25 21:16:06
10 3    
11 2 2017-09-25 21:21:46 2017-09-25 21:21:47
12 1    
13 8    

示例表C:blog

order_id book_id price order_date
1 9 0.2 2017-09-24 21:21:46
2 9 0.6 2017-09-25 21:16:04
3 11 0.1 2017-09-25 21:21:46

在以上表中執行AB表關聯table

SELECT `authors`.*, `books`.book_id FROM `authors` 
LEFT JOIN `books` ON `authors`.author_id = `books`.author_id 

結果class

author_id author_name book_id
1 Kimmy 9
3 Bill 10
2 Abel 11
1 Kimmy 12
4 Berton  

結果出現了2條author_id爲1的記錄,由於右表中存在了兩條關聯author_id=1的行date

右邊出現N條關聯左邊的記錄,結果就會相應出現N條關聯了右表出現的記錄語法

在以上表中執行ABC表關聯im

SELECT `authors`.*, `books`.book_id, `orders`.order_id, `orders`.price FROM `authors` 
LEFT JOIN `books` ON `authors`.author_id = `books`.author_id 
LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id

結果統計

author_id author_name book_id order_id order_price
1 Kimmy 9 1 0.2
1 Kimmy 9 2 0.6
2 Abel 11 3 0.1
3 Bill 10    
1 Kimmy 12    
4 Berton      

結果出現了3條author_id=1的記錄,由於authors第一次關聯了books表book_id爲9和12的book關聯了author_id爲1的做者,而book_id爲9的書本則關聯了兩個orders記錄,因此結果集包含3條author_id爲1的記錄查詢

能夠運用

count(),sum()

等函數經過

group by

來統計結果

SELECT `authors`.*, sum(`orders`.price) FROM `authors` 
LEFT JOIN `books` ON `authors`.author_id = `books`.author_id 
LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id
GROUP BY `books`.book_id

結果集會基於book_id來統計每一本書的訂單總額

author_id author_name book_id sum(order_price)
4 Berton    
1 Kimmy 9 0.80
3 Bill 10  
2 Abel 11 0.10
1 Kimmy 12  

 

book_id爲9的訂單總額爲0.80,而且9的記錄從多條合併爲1條。

 

多條件join

SELECT `authors`.*, `books`.book_id, `orders`.order_id, sum(`orders`.price) FROM `authors` 
LEFT JOIN `books` ON `authors`.author_id = `books`.author_id 
LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id AND `orders`.order_date >= `books`.start_date AND `orders`.order_date <= `books`.end_date
GROUP BY `books`.book_id

選取在必定時間區間範圍內的order訂單,能夠看到訂單order_id爲1的訂單再也不歸入book_id爲9的統計當中,由於它的時間區間不符合join條件

author_id author_name book_id order_id sum(`order`.price)
4 Berton      
1 Kimmy 9 2 0.60
3 Bill 10    
2 Abel 11 3 0.10
1 Kimmy 12    

關於where的使用,看下面示範

SELECT `authors`.*, `books`.book_id, `orders`.order_id, sum(`orders`.price) AS prices FROM `authors`
LEFT JOIN `books` ON `authors`.author_id = `books`.author_id
LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id AND `orders`.order_date >= `books`.start_date AND `orders`.order_date <= `books`.end_date 
WHERE prices is not NULL
GROUP BY `books`.book_id

以上語句假設選取price不爲空的記錄,致使了一個錯誤的出現

[Err] 1054 - Unknown column 'prices' in 'where clause'

由於where不能用於選取列的AS別名判斷,MYSQL的處理機制是先進行選取,再進行篩選,在選取階段就啓用了where條件,由於這時並不存在prices的篩選結果後才產生的字段,因此這裏會拋出錯誤

咱們能夠這樣作

SELECT `authors`.*, `books`.book_id, `orders`.order_id, sum(`orders`.price) AS prices FROM `authors`
LEFT JOIN `books` ON `authors`.author_id = `books`.author_id
LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id AND `orders`.order_date >= `books`.start_date AND `orders`.order_date <= `books`.end_date 
WHERE `orders`.price is not NULL
GROUP BY `books`.book_id

選取階段order表是存在price字段的,因此只有price不爲空的記錄纔會被選取

author_id author_name book_id order_id prices
2 Abel 11 3 0.10
1 Kimmy 9 2 0.60

運用

having

對那些沒法進行 WHERE 的AS別名的字段進行一些篩選查詢

SELECT `authors`.*, `books`.book_id, sum(`orders`.price)AS prices FROM `authors` 
LEFT JOIN `books` ON `authors`.author_id = `books`.author_id 
LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id
GROUP BY `books`.book_id 
HAVING prices > 0.1

這時只有sum爲0.8的結果被選中 

author_id author_name book_id sum(order_price)
1 Kimmy 9 0.80

對於組合其餘語法查詢,也是沒問題的

SELECT `authors`.*, `books`.book_id, sum(`orders`.price)AS prices FROM `authors` 
LEFT JOIN `books` ON `authors`.author_id = `books`.author_id 
LEFT JOIN `orders` ON `books`.book_id = `orders`.book_id
GROUP BY `books`.book_id 
HAVING prices >= 0.1 
ORDER BY prices asc
LIMIT 1,1
相關文章
相關標籤/搜索