2012-11-19 30 views
1

這裏是我的查詢,然後我來解釋一下:SQL,多用多條件加盟,我希望有一個值,即使其他條件爲假

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_productcode_productcompany_id然後我用這個ID_product在我tyds表來記錄

我想是要知道,如果這個用戶使表中的記錄TYDS爲指定的產品,然後得到他的id_user和一些其他的東西。它在有記錄找到時工作,當然不是TYDS表中沒有記錄或對應關係。

但是我想知道的是,如果TYDs表中沒有記錄,即使我能得到users.id_user也是如此。

所以實際上是要獲得users.key_user的結果,即使其他三個條件返回FALSE也是如此。

我知道我上週曾問過類似的問題,但即使採用先前的解決方案,我也找不到。

非常感謝您的幫助!

+0

顯然有一個溝通的問題在這裏。如果你提供了一些記錄樣本和你想要的結果,也許會有所幫助。 – UnhandledExcepSean

回答

0

移動這些條件爲加盟條款的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 「 比賽)。

+0

看到我以前的評論,並再次抱歉,以便回答這麼晚...在這種情況下,我只得到tyds.id_product與products.code_product相匹配的tyds行,所以這很好。但是,如果沒有與products.code_product匹配,我不會獲得users.id_user,即使我沒有tyds中此用戶的記錄,我也很想獲取此ID。 – pierreaurelemartin

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' 
+0

這與我的回答有什麼重大區別? – Bohemian

+0

@波希米亞你還在使用內部連接,並且通過將tyds作爲第一個表格中的第一個表格,你不能得到缺少tyds記錄的用戶標識 – UnhandledExcepSean

+0

對不起,如此晚的回答,我已經嘗試過了,不知道爲什麼,products.code_product&cancelled_product不受尊重,所以我得到products.code_product存在的每個tyds.id_product。但正如你所說,即使這個用戶在tyds中沒有記錄,我也想要users.id_user。 – pierreaurelemartin

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') 

,並獲得B_user即使products.code_product是錯誤等等