2015-02-11 45 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