带子查询的NULL条件语句

时间:2011-02-28 20:39:28

标签: mysql performance conditional

两个表:

user (id, myValue, ...)

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

解释

user是所有用户的表。 user_preferred是任何用户首选值的表。用户可以在user_preferred中多次列出,但必须具有不同的值。查询应返回具有与给定用户的首选值匹配的myValue的所有用户。 $ userid是传递的用户的php变量。

诀窍:

用户可能没有首选项,在这种情况下user_preference表中没有条目。完成上述查询后,如果给定用户没有偏好,我想返回每个用户。

打个比方:

我在酒吧,调酒师问我想要喝什么。我说给我一切符合我偏好的东西。第一轮我说我喜欢蹩脚的啤酒。所以他给了我一个福斯特。第二轮我说我没有偏好,他给了我12品脱,从Bud Light到Guinness。而不是啤酒,这些将是用户。得到它?

查询(目前为止):

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

其他技巧:

我不想两次运行“SELECT preferredValue FROM user.preferred where id = $ userid”。我可以保存第一个运行时的结果,并以某种方式使用它代替第二个吗?

2 个答案:

答案 0 :(得分:2)

SELECT *,(SELECT preferredValue FROM user_preferred WHERE userid = $ userid)AS Result FROM user WHERE

IF(结果为空,1,结果)

答案 1 :(得分: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
         )
       )