SQL,在具有多条件的多连接中,即使其他条件为false,我也想要一个值

时间:2012-11-19 18:09:22

标签: sql left-join inner-join where

这是我的查询然后我解释:

SELECT 
    tyds.product_tyd,
    tyds.user_tyd,
    COALESCE(action_tyd, 'NONE') AS action_tyd 
FROM tyds
INNER JOIN users
    ON tyds.user_tyd = users.id_user
INNER JOIN products
    ON tyds.product_tyd = products.id_product
INNER JOIN companies
    ON products.id_company_product = companies.id_company 
WHERE users.key_user = '14967d378a580cdf020350f4eb626f16'
AND companies.module_key_company = 'daL/RqzZcfqc.'
AND products.cancelled_product >= 0
AND products.code_product = 'app_1'

users.key_user给我users.id_user,它也是tyds.user_tydcompanies.module_key_company给我products.company_id_product

products表中,我允许ID_product使用code_productcompany_id,然后我使用此ID_product记录在tyds表中

我想知道的是,该用户是否在表TYDS中为指定产品创建记录,然后获取他的id_user和其他一些内容。当找到记录时它会起作用,当然不是TYDS表中没有记录或对应的时候。

但我想知道的是,如果users.id_user表中没有记录,我是否可以获得TYDs

事实上,即使其他三个条件返回FALSE,也要得到users.key_user的结果。

我知道上周我问过类似的问题,但即使先前的解决方案我也找不到。

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:1)

根据您的描述,听起来更像是您想要所有用户及其相应的tyds记录的列表,即使他们没有任何相关记录。我相信这就是你想要的。

SELECT
    users.id_user,
    tyds.product_tyd,
    tyds.user_tyd,
    COALESCE(action_tyd, 'NONE') AS action_tyd 
FROM users
LEFT JOIN tyds
    ON tyds.user_tyd = users.id_user
LEFT JOIN products
    ON tyds.product_tyd = products.id_product
    AND products.cancelled_product >= 0
    AND products.code_product = 'app_1'
LEFT JOIN companies
    ON products.id_company_product = companies.id_company
    AND companies.module_key_company = 'daL/RqzZcfqc.'
WHERE users.key_user = '14967d378a580cdf020350f4eb626f16'

答案 1 :(得分:0)

将这些条件移入join子句的ON条件:

SELECT 
    tyds.product_tyd,
    tyds.user_tyd,
    COALESCE(action_tyd, 'NONE') AS action_tyd 
FROM tyds
INNER JOIN users
    ON tyds.user_tyd = users.id_user
INNER JOIN products
    ON tyds.product_tyd = products.id_product
    AND products.cancelled_product >= 0 -- moved from where clause to here
    AND products.code_product = 'app_1'-- moved from where clause to here
INNER JOIN companies
    ON products.id_company_product = companies.id_company 
    AND companies.module_key_company = 'daL/RqzZcfqc.' -- moved from where clause to here
WHERE users.key_user = '14967d378a580cdf020350f4eb626f16'

加入条件可能不仅包含“id匹配”。通过在ON子句中添加特殊条件,可以将返回的行限制为仅以您希望的方式加入的行,但是如果它们没有,则仍然会获得空左连接(即使有其他行包含相同的“id”匹配)。

答案 2 :(得分:0)

我会链接这样的东西:

SELECT B_user, tyds.product_tyd 
FROM tyds
INNER JOIN products ON tyds.`product_tyd` = products.id_product
AND products.`cancelled_product` >= 0
AND products.code_product = 'app_1'
INNER JOIN companies ON products.`id_company_product` = companies.`id_company`
AND companies.`module_key_company` = 'daL/RqzZcfqc.'
WHERE tyds.`user_tyd` IN 
(SELECT id_user AS B_user FROM users WHERE key_user = '14967d378a580cdf020350f4eb626f16') 

即使products.code_product错误等,也要获得B_user ...