mysql:请帮我去掉嵌套子句

mysql:请帮我去掉嵌套子句,mysql,Mysql,我编写了以下查询(由字符串常量组成的重复部分),试图在共享日历应用程序中执行以下操作 搜索当前日期+时间状态不等于0的所有用户的status\u relation 搜索当前工作日+时间状态不等于0的所有用户的default_status_relation。当状态\u关系中没有可用状态时,这将提供默认的每周状态 完全外部连接两个 然后从userid加入用户名 然后由php进行处理,php将显示当天所有具有状态的用户的状态(或默认状态,如果状态不存在的话)=0 php需要知道它返回的是状态还是默认

我编写了以下查询(由字符串常量组成的重复部分),试图在共享日历应用程序中执行以下操作

  • 搜索当前日期+时间状态不等于0的所有用户的
    status\u relation
  • 搜索当前工作日+时间状态不等于0的所有用户的
    default_status_relation
    。当
    状态\u关系中没有可用状态时,这将提供默认的每周状态
  • 完全外部连接两个
  • 然后从userid加入用户名
  • 然后由php进行处理,php将显示当天所有具有状态的用户的状态(或默认状态,如果状态不存在的话)=0
  • php需要知道它返回的是状态还是默认状态
当前,查询可以工作(使用UNION模拟外部联接)。但是,我想优化它-我知道删除子查询可能会有所帮助。如何做到这一点

SELECT q.*,
   users.username,
   users.userid AS uid
FROM   (SELECT *
    FROM   ((SELECT sr.status   AS srstatus,
                    dsr.status  AS dsrstatus,
                    sr.userid   AS sruserid,
                    dsr.userid  AS dsruserid
             FROM   (SELECT *
                     FROM   status_relation
                     WHERE  DATE = '2012-03-19'
                            AND TIME = '0'
                    ) sr
             LEFT JOIN 
                    (SELECT *
                     FROM   default_status_relation
                     WHERE  weekday = '0'
                     AND TIME = '0') 
                    ) dsr
             ON sr.userid = dsr.userid)
          UNION
            (SELECT sr.status   AS srstatus,
                    dsr.status  AS dsrstatus,
                    sr.userid   AS sruserid,
                    dsr.userid  AS dsruserid
             FROM   (SELECT *
                     FROM   status_relation
                     WHERE  DATE = '2012-03-19'
                            AND TIME = '0') sr
                    RIGHT JOIN (SELECT *
                                FROM   default_status_relation
                                WHERE  weekday = '0'
                                       AND TIME = '0') dsr
                      ON sr.userid = dsr.userid)
       ) myjoin
    WHERE  ( ( sruserid IS NOT NULL
               AND srstatus != '0' )
              OR ( sruserid IS NULL
                   AND dsrstatus != '0' ) )) q
   LEFT JOIN users
     ON ( q.sruserid = users.userid
           OR q.dsruserid = users.userid )  

您应该能够更换此部件:

(SELECT sr.status   AS srstatus,
    dsr.status  AS dsrstatus,
    sr.userid   AS sruserid,
    dsr.userid  AS dsruserid
 FROM   (SELECT *
         FROM   status_relation
         WHERE  DATE = '2012-03-19'
             AND TIME = '0'
        ) sr
LEFT JOIN 
    (SELECT *
    FROM   default_status_relation
    WHERE  weekday = '0'
        AND TIME = '0') 
    ) dsr
ON sr.userid = dsr.userid)


一般来说,在UNION上也可以这样做,除非使用某种聚合函数,如SUM(),否则不需要子查询。这看起来很复杂:-/为什么要使用右连接而不是左连接?我正试图通过联合同一事物的左连接和右连接来进行完整的外部连接(mysql 5.1不支持afaik)。我也这么认为,但奇怪的是,查询然后返回日期不为null且与给定日期不匹配的行(时间也是如此)。我不确定你在这里的意思是什么…哪个日期不合适?也许你可以添加一个“并且dsr.date不为空”?
SELECT sr.status   AS srstatus,
    dsr.status  AS dsrstatus,
    sr.userid   AS sruserid,
    dsr.userid  AS dsruserid
 FROM status_relation sr
 left join default_status_relation dsr
   ON sr.userid = dsr.userid and 
       sr.date = '2012-03-19' and 
       sr.time = TIME = '0' and
       dsr.weekday = 0 and 
       dsr.time = 0;