Mysql 如何根据另一列值在查询中选择多个不同的列和联接?

Mysql 如何根据另一列值在查询中选择多个不同的列和联接?,mysql,join,Mysql,Join,我在表A上有一个相当复杂的请求,其中在另一个表B和C(实际上还有更多)上进行了JOIN 我希望在表a中某个字段的特定值上,将字段添加到SELECT中,但也添加不同的联接 我知道我可以使用CASE动态添加列,但是测试值总是相同的,我希望避免对每个字段重复CASE,因为有很多字段。(为了清楚起见,我在案例中将表命名为“B”和“D”,但在实际情况中,它可能与连接别名相同) 是否有一种解决方案可以动态加入并避免长时间重复CASE调用 注意:这只是使用代码生成的查询的一部分,这使得很难使用联合,因为字段是

我在表A上有一个相当复杂的请求,其中在另一个表B和C(实际上还有更多)上进行了
JOIN

我希望在表a中某个字段的特定值上,将字段添加到
SELECT
中,但也添加不同的联接

我知道我可以使用
CASE
动态添加列,但是测试值总是相同的,我希望避免对每个字段重复
CASE
,因为有很多字段。(为了清楚起见,我在
案例中将表命名为“B”和“D”,但在实际情况中,它可能与连接别名相同)

是否有一种解决方案可以动态加入并避免长时间重复
CASE
调用


注意:这只是使用代码生成的查询的一部分,这使得很难使用
联合
,因为字段是在其他地方添加的,并且很难匹配相同数量的选定字段。

您可以将所有
左连接
与当前的
案例
条件作为
上的
的一部分,然后
合并这些表的值。比如:

      SELECT COALESCE(B.b1,D.d1) AS a2,
             COALESCE(B.b2,D.d2) AS a3,
             COALESCE(B.b3,D.d3) AS a4,
             ...
        FROM A
   LEFT JOIN B ON {normal_join_condition} AND A.a1 = 1
   LEFT JOIN C ON {normal_join_condition} AND A.a1 = 1
   LEFT JOIN D ON {normal_join_condition} AND A.a1 = 2
   LEFT JOIN E ON {normal_join_condition} AND A.a1 = 2

请注意,在我回答之前可能需要一点时间,因为它很复杂,我必须在实际情况下测试它(不能简化它,因为还有其他参数)。我还需要考虑一下,因为有些字段可能会有不同的名称,所以我需要复制它们。这也应该适用于更多的
JOIN
s。如果有表F和G在
A.a1=3
上连接,则可以将
选择
更改为
合并(B.b1、D.d1、F.f1)为a2、
等。它仍然有点混乱,但应该比要求的
案例
更好,以执行相同的逻辑抱歉,我刚刚意识到,我今天做的上一个测试确实将值设置为
NULL
,因此我无法意识到它的工作原理。原始查询中的一个
JOIN
用于筛选出一些在联接表中没有条目的行,因此我仍然需要测试使用
LEFT JOIN
是否会对此产生影响,但答案是肯定的!连接表中没有条目的行不再被过滤掉,但我可以处理它,因为我应该能够解决它(在我的例子中,添加
WHERE
条件很棘手,但并非不可能)。如果你已经知道了这个问题的解决方案,请随意添加,我仍然接受你的回答。我需要更多关于应该过滤掉的行的信息。如果它对性能影响不大,那么使用
HAVING
子句可能比
WHERE
更容易。这取决于你需要过滤掉什么。
      SELECT COALESCE(B.b1,D.d1) AS a2,
             COALESCE(B.b2,D.d2) AS a3,
             COALESCE(B.b3,D.d3) AS a4,
             ...
        FROM A
   LEFT JOIN B ON {normal_join_condition} AND A.a1 = 1
   LEFT JOIN C ON {normal_join_condition} AND A.a1 = 1
   LEFT JOIN D ON {normal_join_condition} AND A.a1 = 2
   LEFT JOIN E ON {normal_join_condition} AND A.a1 = 2