2016-02-21 120 views
0

用戶和產品的典型場景,如果用戶未分配任何產品但返回空值,則希望查詢返回'false'。如果沒有找到記錄返回false,則返回false

serviceRequest.sql = "SET @productId = ?;\ 
    SELECT IF(product.productId = @productId, 'true', 'false') AS entitled FROM user_token \ 
    INNER JOIN user_product ON user_token.user_id = user_product.user_id \ 
    INNER JOIN product ON user_product.product_id = product.id AND authToken = ? AND product.productId = @productId;"; 

serviceRequest.values = [request.query.productId, request.query.authToken]; 

回答

2

where標準是使它返回,而不是false空。這應該不過使用outer joins工作,而不是:

SELECT IF(ut.user_id IS NOT NULL, 'true', 'false') AS entitled 
FROM product p 
    LEFT JOIN user_product up ON p.id = up.product_id 
    LEFT JOIN user_token ut ON up.user_id = ut.user_id 
          AND ut.authToken = ? 
WHERE p.productId = @productId; 
+0

能否請您解釋一下爲什麼你開始從產品,而不是在我的情況user_token的加盟,這件事情我永遠不能避開 – user2727195

+0

我的頭這篇文章可以幫助(HTTP:// blog.codinghorror.com/a-visual-explanation-of-sql-joins/)。基本上你想確保你總是回報產品。所以你從該表開始,並將「外連接」開始到信息是可選的表。既然你想檢查一個用戶是否存在,你可以將'outer join'加入到這個表中,然後你就可以檢查。如果你對該表進行「內部連接」並且該記錄不存在,則不會返回結果。 – sgeddes

+0

謝謝,同樣如果你可以請看看這個來改善我對我問題的回答。 http://stackoverflow.com/questions/35528816/sql-multiple-statements-with-conditions – user2727195

0

可以使用CASE聲明:

CASE WHEN product.productId IS NULL THEN 'False' ELSE 'True' END