2015-02-11 43 views
0

這裏是我們的DB設置:顯示MySQL的左連接在第二個表中多個匹配正確

成員:

members table

地址:

addresses table

標題:

titles table

這就是我們所需要的輸出:

先生李四MSC A-1100維也納(A00025)
夫人傑米·史密斯A-4040林茨(A00026)
傑克瓊斯A-5020薩爾茨堡(A00027)

這是迄今爲止我們的MySQL聲明:

SELECT T1.member_id, T1.surname, T1.firstname, T2.country, T2.zip, T2.town, 
    T3.titel, T3.position FROM members T1 
    LEFT JOIN addresses T2 
    ON T1.member_id = T2.member_id 
    LEFT JOIN titles T3 
    ON T1.member_id = T3.member_id 
    WHERE T2.type = "invoice" 

這給我們:

先生李四A-1100維也納(A00025)
李四MSC A-1100維也納(A00025)
夫人傑米·史密斯A-4040林茨(A00026)
傑克·瓊斯-5020薩爾茨堡(A00027)

我們如何防止John Doe被列出兩次? 我們如何在同一行中獲得兩個標題?

感謝您的任何幫助!

回答

1
陳述 T2.type = "invoice"你不需要 LEFT JOIN

這裏的關鍵是加入標題表多次,因爲可以有不同的標題位置,以便您可以從不同的來源訪問每個不同的標題/位置。

如果你想從你的查詢產生一個像Mr Doe John MSc A-1100 Vienna (A00025)這樣的字符串,你可以使用concat函數來構建它。

SELECT 
    concat(
    case when t1.titel is null then '' else t1.titel end, 
    case when t1.titel is null then '' else ' ' end, 
    m.firstname, ' ', 
    m.surname, ' ', 
    case when t2.titel is null then '' else t2.titel end, 
    case when t2.titel is null then '' else ' ' end, 
    a.country, '-', a.zip, ' ', 
    a.town, 
    ' (', m.member_id , ')' 
) AS LongString  

FROM members m 
JOIN addresses a 
    ON m.member_id = a.member_id AND a.type = 'invoice' 
LEFT JOIN titles t1 
    ON m.member_id = t1.member_id AND t1.position = 'Before' 
LEFT JOIN titles t2 
    ON m.member_id = t2.member_id AND t2.position = 'After' 

Sample SQL Fiddle

輸出示例:

|        LONGSTRING | 
|----------------------------------------| 
| Mr John Doe MSc A-1100 Vienna (A00025) | 
| Mrs Jamie Smith A-4040 Linz (A00026) | 
| Jack Jones A-5020 Salzburg (A00027) | 
+0

感謝JPW。看起來不錯。如果我不知道桌子上有多少個不同的職位,該怎麼辦? – 2015-02-13 20:13:01

+0

@RichardTinkler如果你不知道有多少個不同的標題,他們應該在什麼位置,你需要使用某種動態sql,或者可能在數據庫之外處理查詢。 – jpw 2015-02-13 20:15:11

1

假設你有一個最大的前僅1標題和標題1後:

SELECT T1.member_id, T1.surname, T1.firstname, 
    T2.country, T2.zip, T2.town, 
    T3.titel AS titelBefore, 
    T4.titel AS titelAfter, 
FROM members T1 
    INNER JOIN addresses T2 ON (T1.member_id = T2.member_id) 
    LEFT JOIN titles T3 ON (T1.member_id = T3.member_id AND T3.position = "before") 
    LEFT JOIN titles T4 ON (T1.member_id = T4.member_id AND T4.position = "after") 
WHERE T2.type = "invoice" 

請注意:INNER JOIN的地址,因爲你在WHERE