2016-04-28 50 views
0

的某些部分如何做检查,如果特定列null,则忽略查询的某些部分如何做检查,如果特定列null,则忽略查询

我想要得到的结果包括这两个行,但低于查询,如果user_id为null,则不行

SELECT 
    mc.* FROM media_credit mc 
    LEFT JOIN credit c ON c.id = mc.credit_id 
    LEFT JOIN "user" u ON u.id = mc.user_id 
    LEFT JOIN "user" _u ON u.id = c.create_by_user_id 
    WHERE mc.media_id = $1 
    c.status = $2 
    AND u.status = $2 // how to make if mc.user_id is null then dont use this 
    AND _u.status = $2 

media_credit 
id | media_id | credit_id | username | user_id 
1 | 1  | 1   | xx  | null 
2 | 1  | 1   | null  | 1 

user 
id | status 
1 | 0 

credit 
id | status | create_by_user_id 
1 | 0  | 32 

回答

2

你应该把其他条件从WHERE条款到ON条款:

SELECT mc.* 
FROM media_credit mc 
LEFT JOIN credit c 
    ON c.id = mc.credit_id 
    AND c.status = $2 
LEFT JOIN "user" u 
    ON u.id = mc.user_id 
    AND u.status = $2 
LEFT JOIN "user" _u 
    ON u.id = c.create_by_user_id 
    AND _u.status = $2 
WHERE 
    mc.media_id = $1 

当过滤WHERE子句中的表,您LEFT JOIN将被改造成一个INNER JOIN,从而丢弃不匹配的行。

1

您可以在where子句中使用CASE语句...如果mc.user_id为NULL,则$ 2 = $ 2有效去除AND子句

SELECT 
    mc.* FROM media_credit mc 
    LEFT JOIN credit c ON c.id = mc.credit_id 
    LEFT JOIN "user" u ON u.id = mc.user_id 
    LEFT JOIN "user" _u ON u.id = c.create_by_user_id 
    WHERE mc.media_id = $1 
    c.status = $2 
    AND _u.status = $2 
    AND CASE WHEN mc.user_id is NULL THEN $2 
     ELSE u.status END = $2 
+0

感谢的答复是什么,然后$ 2的含义?这是否意味着如果'WHEN mc.user_id是NULL'什么也不做?但为什么输入一个参数? – user1575921

+1

仅供参考......我最喜欢费利克斯的回答。 2美元没有特别的意义。这是你原来的问题。技巧是$ 2 = $ 2或0 = 0或'x'='x',这样当mc.user_id为NULL时AND子句基本上被忽略。 –

相关问题