2011-02-28 56 views
1

兩個表:MySQL在NULL條件語句與子查詢

user (id, myValue, ...) 

user_preferred (id, userid, preferredValue) fk userid -> user(id) 

說明:

用戶是所有用戶的表。 user_preferred是任何用戶首選值的表格。用戶可以在user_preferred中多次列出,但必須具有不同的值。查詢應返回具有與給定用戶的首選值相匹配的myValue的所有用戶。 $ userid是用戶傳遞的php變量。

的伎倆:

用戶可能沒有任何偏好,在這種情況下沒有在user_preference表中沒有條目。當上述查詢完成時,如果給定用戶沒有偏好,我想返回每個用戶。

打個比方:

我在一個酒吧和酒保問我,我想喝點什麼。我說給他我符合我的偏好的一切。第一輪我說我喜歡蹩腳的啤酒。所以他給了我一個福斯特。第二輪我說我沒有偏好,他給我12個品種,從芽蕾到吉尼斯。這些將是用戶,而不是啤酒。得到它?

查詢(到目前爲止):

SELECT * FROM user WHERE 
IF ((SELECT preferredValue FROM user_preferred WHERE userid = $userid) IS NULL, 
    1, 
    user.myValue ANY (SELECT preferredValue FROM user_preferred WHERE userid = $userid) 
) 

附加絕招:

我不想跑 「選擇preferredValue FROM user.preferred其中id = $用戶ID」 兩次。我可以從第一次運行時保存結果,並以某種方式使用它來代替第二次運行?

回答

0

要返回用戶的列表:

SELECT o.* 
    FROM `user` o 
WHERE o.id IN 
    (SELECT DISTINCT m.userid 
     FROM user_preferred m 
     WHERE EXISTS 
       (SELECT 1 FROM user_preferred p 
       WHERE p.preferredValue = m.preferredValue 
        AND p.userid <> m.userid 
        AND p.userid = $userid) 
    ) 
    OR (o.id <> $userid AND NOT EXISTS 
     (SELECT 1 
      FROM user_preferred q 
      WHERE q.userid = $userid 
     ) 
     ) 
+0

它需要一點調整,但就是這樣。非常感謝,斯賓塞。 – BlackHat 2011-02-28 22:07:29

2

SELECT *,(SELECT preferredValue FROM user_preferred其中userid = $用戶ID)AS導致用戶WHERE

IF(結果爲NULL,1,RESULT)