【问题标题】:Selecting a value from a table with a dynamically where statement使用动态 where 语句从表中选择一个值
【发布时间】:2020-10-24 23:58:24
【问题描述】:

我有以下4张桌子

表 a: ID, 姓名, 出价, c_id

表 b: ID, 姓名, d_id

表 c: ID, 姓名, d_id

表 d: ID, 名字

然后我有我的查询,就我能写的而言:

SELECT a.name as a_name, b.name as b_name, c.name as c_name, d.name as d_name 
FROM a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON a.c_id = c.id

我需要添加一个带有动态 ON 的 LEFT JOIN 寻址表“d”。 它应该是 左连接 d ON b.d_id = d.id (如果 a.b_id != 0) 要么 左连接 d ON c.d_id = d.id(如果 a.b_id == 0)

我试着写

SELECT a.name as a_name, b.name as b_name, c.name as c_name, d.name as d_name 
FROM a 
LEFT JOIN b ON a.b_id = b.id 
LEFT JOIN c ON a.c_id = c.id
if((if a.b_id != 0,LEFT JOIN d ON b.d_id = d.id, LEFT JOIN d ON c.d_id = d.id )

但这会引发错误

您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 'IF(a.b_id != 0, LEFT JOIN d ON b.d_id = d.id, LEFT JOIN d ON c.d_id = d.id 附近使用的正确语法)' 在第 6 行"

【问题讨论】:

  • 你也可以加入两次,在select中使用case表达式选择正确的表

标签: mysql sql if-statement select left-join


【解决方案1】:

好吧,你可以使用:

FROM a LEFT JOIN
     b
     ON a.b_id = b.id LEFT JOIN
     c
     ON a.c_id = c.id LEFT JOIN
     d
     ON (a.b_id <> 0 AND b.d_id = d.id) OR
        (a.b_id = 0 AND c.d_id = d.id)

这不考虑NULL 值。如果需要:

     ON (a.b_id <> 0 AND b.d_id = d.id) OR
        (COALESCE(a.b_id, 0) = 0 AND c.d_id = d.id)

在 SQL 中,CASE 是一个返回值的表达式。它不是代码被替换的宏。

此外,这也回答了您在此处提出的问题。但是,这可能不是完成您想要的最高效的方式。如果您还需要性能方面的帮助,请提出 问题。提供样本数据、期望的结果以及您想要实现的逻辑的解释。 DB/SQL Fiddle 也有帮助。

【讨论】:

    【解决方案2】:

    你可以试试:

    SELECT a.name as a_name, b.name as b_name, c.name as c_name, d.name as d_name 
    FROM a 
    LEFT JOIN b ON a.b_id = b.id 
    LEFT JOIN c ON a.c_id = c.id
    LEFT JOIN
        ON (a.b_id <> 0 AND b.d_id = d.id) OR (a.b_id = 0 AND c.d_id = d.id);
    

    【讨论】:

      【解决方案3】:

      您不能像这样动态添加连接子句,但您可以使用一些逻辑运算符来模拟连接条件内的功能:

      SELECT    a.name as a_name, b.name as b_name, c.name as c_name, d.name as d_name 
      FROM      a 
      LEFT JOIN b ON a.b_id = b.id 
      LEFT JOIN c ON a.c_id = c.id
      LEFT JOIN d ON (a.b_id != 0 AND b.d_id = d.id) OR (a.b_id = 0 AND c.d_id = d.id)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-01
        • 1970-01-01
        • 2020-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多