MySql:有条件的加入

时间:2015-07-02 13:47:26

标签: mysql join left-join

由于B.column1不明确,我得到重复的行。

这就是为什么我只想要B个表column2包含'x''y'等条目的行'x''y' { {1}},'z')。

'x'的优先级超过'y',因此用户宁可'x'而非'y'。我认为最后一行中的条件可以解决这个问题:

SELECT 
   *
FROM A
   LEFT JOIN B on B.column1=A.column1 
        AND B.column2= (IF(B.column2 = 'x','x','y'))

但事实证明它和我写的一样

   AND (B.column2 = 'x' OR B.column2 = 'y')

- >它连接两行而不是一行。

这个问题有(好的)解决方案吗?请记住,我可能想要加入更多的表而不仅仅是一个表。

修改

不能工作

(B.column2 = 'x' XOR B.column2 = 'y')

无法工作

(B.column2 = 'x' OR B.column2 = 'y') AND NOT (B.column2 = 'x' AND B.column2 = 'y')

我甚至不接受,因为它不是'x' rather than'y',而是either 'x' or 'y'。 但它告诉我,我可能有错误的做法

EDIT2

我使用了Jean Jung稍微不同的方法:

我决定更深入地了解这个问题,因为我无法用conditional joins来解决问题。现在这就是我想要加入的多个表的样子:

SELECT 
   *
FROM A
   LEFT JOIN I on I.unique = A.unique
   LEFT JOIN B on B.column1 = I.column1 
   LEFT JOIN J on J.unique = A.unique
   LEFT JOIN B AS C on C.column1 = J.column1 and B.column2 = C.column2
   LEFT JOIN K on K.unique = A.unique
   LEFT JOIN B AS D on D.column1 = K.column1 and C.column2 = D.column2
WHERE B.column2 = 'x'
UNION
SELECT 
   *
FROM A
   LEFT JOIN I on I.unique = A.unique
   LEFT JOIN B on B.column1 = I.column1 
   LEFT JOIN J on J.unique = A.unique
   LEFT JOIN B AS C on C.column1 = J.column1 and B.column2 = C.column2
   LEFT JOIN K on K.unique = A.unique
   LEFT JOIN B AS D on D.column1 = K.column1 and C.column2 = D.column2
WHERE B.column2 = '' AND A.unique NOT IN (
    SELECT 
       A.unique
    FROM A
       LEFT JOIN I on I.unique = A.unique
       LEFT JOIN B on B.column1 = I.column1 
       LEFT JOIN J on J.unique = A.unique
       LEFT JOIN B AS C on C.column1 = J.column1 and B.column2 = C.column2
       LEFT JOIN K on K.unique = A.unique
       LEFT JOIN B AS D on D.column1 = K.column1 and C.column2 = D.column2
    WHERE B.column2 = 'x'
)

这需要相当长的一段时间,但确实有效。我不满意,因为它似乎非常不优雅,但如果没有更好的解决方案,我会选择这一点(说实话,我真的不明白,为什么会有效)。

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,这是一种可能的方法:

SELECT A.*, IF(B_X.column1 IS NOT NULL, B_X.column2, B_Y.column2), IF(B_X.column1 IS NOT NULL, B_X.column3, B_Y.column3), ...
FROM A
LEFT OUTER JOIN B B_X ON A.column1 = B_X.column1 AND B_X.column2 = 'x'
LEFT OUTER JOIN B B_Y ON A.column1 = B_Y.column1 AND B_Y.column2 = 'y'

你必须在SELECT子句的IF()中列出你想要的每一列,以便在'y'值之前得到'x'值。