Mysql 使用Case(或其他方法)使用查询中的值更改查询的WHERE子句
假设我们有4张桌子Mysql 使用Case(或其他方法)使用查询中的值更改查询的WHERE子句,mysql,sql,Mysql,Sql,假设我们有4张桌子 TableA A_Id int ValA1 int ValA2 int ValA3 int TableB B_Id int ValB1 int ValB2 int ValB3 int TableC C_Id int A_Id int B_Id int D_Id int Type Varchar(1) TableD D_Id int ValD Varchar(50) 用户输入为$A、$B
TableA
A_Id int
ValA1 int
ValA2 int
ValA3 int
TableB
B_Id int
ValB1 int
ValB2 int
ValB3 int
TableC
C_Id int
A_Id int
B_Id int
D_Id int
Type Varchar(1)
TableD
D_Id int
ValD Varchar(50)
用户输入为$A、$B和$D
我想要的是以下结构:
If (TableC.Type == 'A' AND TableA.ValA1 == $A AND TableD.ValD == $D)
{
Return TableA.ValA2, TableA.ValA3, TableD.ValD
}
Else If(TableC.Type == 'B' AND TableB.ValB1 == $B AND TableD.ValD == $D)
{
Return TableB.ValB2, TableB.ValB3, TableD.ValD
}
Else If((TableC.Type == 'C' OR TableC.Type == 'D') AND TableD.ValD == $D)
{
Return TableA.ValA2, TableA.ValA3, TableB.ValB2, TableB.ValB3, TableD.ValD
}
这可能吗?如果是,正确的语法是什么
SELECT TableA.ValA2 AS field1, TableA.ValA3 AS field2, TableD.ValD AS field3, NULL AS field4, NULL AS field5
FROM (joined tableset)
WHERE (TableC.Type == 'A' AND TableA.ValA1 == $A AND TableD.ValD == $D)
UNION ALL
SELECT TableB.ValB2, TableB.ValB3, TableD.ValD, NULL, NULL
FROM (joined tableset)
WHERE (TableC.Type == 'B' AND TableB.ValB1 == $B AND TableD.ValD == $D)
UNION ALL
SELECT TableA.ValA2, TableA.ValA3, TableB.ValB2, TableB.ValB3, TableD.ValD
FROM (joined tableset)
WHERE ((TableC.Type == 'C' OR TableC.Type == 'D') AND TableD.ValD == $D)
通常情况下,在满足该条件的情况下,此处的条件必须没有交叉潜力。如果不是,则每个下一个条件必须伴随而不是之前的条件。类型未知,只有通过表D和C之间的连接,类型值才能恢复并准备使用。所以这只有在我把它分成两个单独的动作时才有可能。你不能用。我不确定您从何处获得提供完整查询的类型。@panoskarajohn我实际上尝试过,因此标题中提到了Case,但我无法获得正确的语法。您能提供该查询吗?也许我们可以更正它。看到给出了正确的答案,并且查询本身没有进行任何操作,我没有保存它。但它涉及到使用子查询获取table.Type值,并使用该值在SELECT和中创建一系列案例,其中使用实际数据时,查询会变得有点臃肿,但确实有效。唯一需要注意的是在联接中,您需要在Select A中排除表B,选择B中的表A,并将它们作为最后的左联接。@A.bakker唯一需要注意的是,在联接中,您可以自由构建最佳查询,以获得每个单独条件的结果集,包括联接表列表中的差异。唯一需要匹配的是数据量和数据类型兼容,并且可以转换为第一个字段。MySQL非常忠实于数据类型的差异——似乎唯一可能导致查询失败的问题是排序强制问题。