【问题标题】:MySQL multiple join with ifMySQL 多重连接 if
【发布时间】:2019-02-25 16:50:01
【问题描述】:

这里是 MySQL 菜鸟。

所以我有一个像这样的主表 TableA(ID int,TableBID int,TableCID int),我想将 TableA 与 TableB(ID int,Value1 int,AgeID int)和 TableC(ID int,Value1 int,AgeID int) 以获取 AgeID。

对于表 A,它只有 TableBID 或 TableCID 的值。另一个将是 0。

最后,我想使用从 TableB 或 TableC 获得的 AgeID 并左连接 Age (ID int, age int) 来获取年龄。

我希望我得到的表格最后是这种格式(TableA.ID,Age.age)

现在我的查询是

SELECT a.ID, age.age
FROM TableA AS a
LEFT JOIN TableB AS b ON a.TableBID = b.ID
LEFT JOIN TableC AS c ON a.TableCID = c.ID

那我就卡住了。

任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以使用子查询使AgeID 的来源透明:

    select sub.ID, Age.age
    from (
        select a.ID as ID, if(a.TableBID, b.AgeID, c.AgeID) as AgeID
        from TableA a
        left join TableB b on a.TableBID = b.ID
        left join TableC c on a.TableCID = c.ID
    ) sub
    join Age on sub.AgeID = Age.ID
    

    另一种方法是直接加入 OR 子句:

    select a.ID as ID, Age.age
    from TableA a
    left join TableB b on a.TableBID = b.ID
    left join TableC c on a.TableCID = c.ID
    join Age on (
        Age.ID = b.AgeID
        or
        Age.ID = c.AgeID
    )
    

    【讨论】:

    • 我喜欢带有 OR 子句的那个,我认为这是一个比其他的跑得更快的那个,因为它的连接更少。
    • 如果速度在您的应用程序中很重要,值得检查EXPLAIN plan,因为连接较少的可能不一定是最快的。使用正确的索引,JOIN 可以非常快。
    【解决方案2】:

    您可以在 TableB 和 TableC 中使用 Age 进行 LEFT JOIN,然后使用 COALESCE 从成功的 JOIN 中获取年龄值。下面是一个如何使用现有查询的示例:

    SELECT a.ID, COALESCE(bAge.age, cAge.age) AS age
    FROM TableA AS a
    LEFT JOIN TableB AS b ON a.TableBID = b.ID
    LEFT JOIN TableC AS c ON a.TableCID = c.ID
    LEFT JOIN Age AS bAge ON b.AgeID = bAge.ID
    LEFT JOIN Age AS cAge ON c.AgeID = cAge.ID
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      相关资源
      最近更新 更多