【问题标题】:Displaying mySQL LEFT JOIN with multiple matches in second table correctly在第二个表中正确显示具有多个匹配项的 mySQL LEFT JOIN
【发布时间】:2015-04-11 17:57:30
【问题描述】:

这是我们的数据库设置:

成员:

地址:

标题:

这就是我们需要的输出:

Mr John Doe Msc A-1100 维也纳 (A00025)
Jamie Smith 夫人 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"

这给了我们:

Mr John Doe A-1100 维也纳 (A00025)
John Doe 理学硕士 A-1100 维也纳 (A00025)
Jamie Smith 夫人 A-4040 林茨 (A00026)
杰克琼斯 A-5020 萨尔茨堡 (A00027)

我们如何防止 John Doe 被两次列出? 我们如何将两个标题放在同一行中?

感谢您的帮助!!

【问题讨论】:

    标签: mysql select left-join inner-join


    【解决方案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 的地址,您不需要LEFT JOIN,因为您在WHERE 中声明了T2.type = "invoice"

    【讨论】:

      【解决方案2】:

      这里的关键是尽可能多地加入标题表,因为可以有不同的标题位置,以便您可以从不同的来源访问每个不同的标题/位置。

      如果您想从查询中生成类似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) |
      

      【讨论】:

      • 感谢 jpw。看起来不错。如果我不知道表格中有多少个不同的标题位置怎么办?
      • @RichardTinkler 如果您不知道可以有多少不同的标题或它们应该在什么位置,您需要使用某种动态 sql 或者可能在数据库之外处理查询。跨度>
      猜你喜欢
      • 2011-07-14
      • 2013-11-18
      • 2018-07-17
      • 1970-01-01
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 1970-01-01
      相关资源
      最近更新 更多