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需要知道它返回的是状态还是默认状态
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;