2014-09-24 47 views
0

我有這些下表:sql查詢與條件上加入連接表

suppliers

id | name 
----------- 
1 | sample 

addresses

id | address | owner_type | owner_id 
------------------------------------- 
1 | adres | Supplier | 1 

phone_numbers

id | number | owner_type | owner_id | phone_type 
------------------------------------------------ 
1 | 12345 | Supplier | 1  | phone 
2 | 67890 | Supplier | 1  | fax 

對地址表來說,這似乎不是一個問題,我使用這個查詢,我測試了它,它工作正常。

Select suppliers.*, addresses.address AS address FROM suppliers LEFT JOIN addresses ON (addresses.owner_id = suppliers.id AND addresses.owner_type = 'Supplier') 

現在的問題是在phone_number表中,有2條與2個不同的條件,你可以看到:

id | number | owner_type | owner_id | phone_type 
------------------------------------------------ 
1 | 12345 | Supplier | 1  | phone 
2 | 67890 | Supplier | 1  | fax 

phone_type場 - >phonefax,我想在結果表明兩者的是,像這樣的:

id | name | address | phone | fax 
--------------------------------- 
1 | sample | adres | 12345 | 67890 

我嘗試此查詢:

LEFT JOIN phone_numbers ON (phone_numbers.owner_id = suppliers.id AND phone_numbers.owner_type = 'Supplier' AND phone_type = 'phone') 

不幸的是,查詢只適用於1條件(phone),我如何獲得傳真值?

我使用PostgreSQL。

+0

在phone_numbers表上做第二次左連接,但是這次使用'fax'的phone_type。 – Bobby 2014-09-24 07:57:07

+0

讓試試下面這個鏈接可以幫助你, http://stackoverflow.com/questions/12169016/simple-pivot-sample – RickyRam 2014-09-24 08:05:54

回答

0

您可以使用不同的別名將phone_numbers表加入兩次,一個用於電話,一個用於傳真。如P1下面的電話和P2的傳真。

Select suppliers.*, addresses.address AS address ,P1.number as 'Phone', P2.number as 'Fax' 
FROM suppliers 
LEFT JOIN addresses ON (addresses.owner_id = suppliers.id AND addresses.owner_type = 'Supplier') 
LEFT JOIN phone_numbers P1 ON (P1.owner_id = suppliers.id AND P1.owner_type = 'Supplier' AND P1.phone_type = 'phone') 
LEFT JOIN phone_numbers P2 ON (P2.owner_id = suppliers.id AND P2.owner_type = 'Supplier' AND P2.phone_type = 'fax') 
+0

哇,,它的神奇,它的做工非常精細,非常感謝你的兄弟,,, , – azy 2014-09-24 08:07:40

+0

對於類型數量較多(如phone_type)較多或變量較大(不固定)的情況,您可以探索將行值轉換爲列值的透視功能。 – Priyank 2014-09-24 08:43:06