【问题标题】:MySQL conditional statement on NULL with subquery带有子查询的 NULL MySQL 条件语句
【发布时间】:2011-07-06 01:28:50
【问题描述】:

两个表:

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”。我可以保存第一个运行时的结果并以某种方式使用它来代替第二个吗?

【问题讨论】:

    标签: mysql performance conditional


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      返回用户列表:

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

      【讨论】:

      • 它需要一些调整,但就是这样。非常感谢,斯宾塞。
      猜你喜欢
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多