2016-12-02 31 views
1

做了許多搜索並能夠編寫除此之外的所有JOIN查詢。我有3個表,看起來像:MySQL - 通過將多個表連接到多個WHERE/OR子句來返回單個記錄

TABLE - accounts 
account_id | account_email 
1   | [email protected] 
2   | [email protected] 

TABLE - products 
product_id | product_name 
1   | name1 
2   | name2 

TABLE - licenses 
license_id | account_id | product_id | license_code 
1   | 1   | 1   | 
2   | 1   | 2   | 
3   | 0   | 1   | abc123 

我知道account_emailproduct_idlicense_code(這一個可以爲空)變量,需要檢查客戶端許可證所選產品(通過account_emaillicense_code搜索) 。

問題是account_id有時可能是0(換句話說,客戶端有許可證,但客戶端的配置文件沒有存儲在帳戶表中)。

試圖用這一個,但它返回錯誤的(重複)的結果:

SELECT * FROM licenses 
INNER JOIN products ON licenses.product_id=products.product_id AND products.product_id='X' 
INNER JOIN accounts ON licenses.account_id=accounts.account_id AND accounts.account_email='XYZ' OR licenses.license_code='ZZZ' 

的問題:我該如何改寫查詢,這樣我就可以通過account_emaillicense_code領域找到一個記錄?簡而言之,如果account_id不是0(存在配置文件),我應該看到來自3個表(帳戶,產品,許可證)的數據。如果account_id爲0,我應該看到來自2個表的數據(來自accounts表的值應該顯示爲空/空)。不用說,account_emaillicense_code字段是唯一的。

回答

0

經過一些更多的代碼修改和測試,這裏是完美的代碼。這是一個修改後的Gordon Linoff代碼(當只有license_code已知時,原始代碼才工作,並且電子郵件地址未知)。因此,大部分學分都是爲了Gordon Linoff的努力。

SELECT * 
FROM licenses l JOIN 
    products p 
    ON l.product_id = p.product_id LEFT JOIN 
    accounts a 
    ON l.account_id = a.account_id 
WHERE p.product_id = 'X' AND 
     (a.account_email='XYZ' OR l.license_code = 'ZZZ') 
0

你只需要調整括號。不過,我會用一個單獨的WHERE條款:

SELECT * 
FROM licenses l INNER JOIN 
    products p 
    ON l.product_id = p.product_id INNER JOIN 
    accounts a 
    ON l.account_id = a.account_id 
WHERE p.product_id = 'X' AND 
     (a.account_email='XYZ' OR l.license_code = 'ZZZ') 

你可以保持過濾器在ON條款 - 沒有什麼不妥。我只是希望將過濾條件中的連接條件分開。最重要的部分是括號,所以ON條款不被解釋爲:

ON (l.account_id = a.account_id AND a.account_email = 'XYZ') OR 
    licenses.license_code = 'ZZZ' 

這是一個沒有括號解釋。

+0

需要從第二次加入之前刪除'AND': –

+0

感謝您的建議。它顯示了多個SQL錯誤,所以我通過在第二次加入之前刪除「AND」並在最後一個「WHERE」之前刪除「AND」來修改它。希望它仍然可以嗎? –

+0

不幸的是,代碼不起作用。當account_email存在於數據庫中時,它可以正常工作,但是當account_email在數據庫中不存在時(因此記錄需要通過license_code找到),將顯示0個結果。 –