如何在mysql中使用join和union进行子查询

时间:2017-05-30 10:41:17

标签: mysql join subquery union

我试图在两个子查询中使用连接和联合。这是我的疑问:

SELECT Service,SP.Second_Period, SP.TRX_SP,FP.First_Period,FP.TRX_FP
FROM (((SELECT Service, SUM(Processed) as Second_Period, COUNT(Processed) as TRX_SP
FROM pay
WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-07 00:00:00' and '2017-05-14 00:00:00' 
GROUP BY Service) SP
RIGHT JOIN
(SELECT Service, SUM(Processed) as First_Period, COUNT(Processed) as TRX_FP
FROM pay
WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-01 00:00:00' and '2017-05-06 00:00:00' 
GROUP BY Service) FP USING (Service))
UNION ALL
((SELECT Service, SUM(Processed) as Second_Period, COUNT(Processed) as TRX_SP
FROM pay
WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-07 00:00:00' and '2017-05-14 00:00:00' 
GROUP BY Service) SP
LEFT OUTER JOIN
(SELECT Service, SUM(Processed) as First_Period, COUNT(Processed) as TRX_FP
FROM pay
WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-01 00:00:00' and '2017-05-06 00:00:00' 
GROUP BY Service) FP USING (Service) ))  as tbl2
WHERE SP.Service=FP.Service
GROUP BY Service
Order BY Service

通过这样做,它返回给我这个错误:

  

1064 - 您的SQL语法出错;检查与MariaDB服务器版本对应的手册,以获得正确的语法

     'LEFT OUTER JOIN附近(SELECT服务,SUM(已处理)为First_Period,   COUNT(第16行处理'

我做错了什么?因为我无法在mysql中使用Full Outer Join,所以我正在使用左右连接。

更新

这是使用DAYNAME(Dataime)替换服务的ny代码

SELECT *
FROM (
(
SELECT * FROM
(SELECT DAYNAME(Dataime), SUM(Processed) as Second_Period, COUNT(Processed) as TRX_SP
FROM pay
WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-07 00:00:00' and '2017-05-14 00:00:00' 
GROUP BY DAYNAME(Dataime)) SP
RIGHT JOIN
(SELECT DAYNAME(Dataime), SUM(Processed) as First_Period, COUNT(Processed) as TRX_FP
FROM pay
WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-01 00:00:00' and '2017-05-06 00:00:00' 
GROUP BY DAYNAME(Dataime)) FP USING (DAYNAME(Dataime)))
UNION ALL
(
SELECT * FROM
(SELECT DAYNAME(Dataime), SUM(Processed) as Second_Period, COUNT(Processed) as TRX_SP
FROM pay
WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-07 00:00:00' and '2017-05-14 00:00:00' 
GROUP BY DAYNAME(Dataime)) SP
LEFT OUTER JOIN
(SELECT DAYNAME(Dataime), SUM(Processed) as First_Period, COUNT(Processed) as TRX_FP
FROM pay
WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-01 00:00:00' and '2017-05-06 00:00:00' 
GROUP BY DAYNAME(Dataime)) FP USING (DAYNAME(Dataime)) ))  as tbl2
GROUP BY DAYNAME(Dataime)
Order BY DAYNAME(Dataime)

这是错误:

  

1064 - 您的SQL语法出错;检查与MariaDB服务器版本对应的手册,以获得正确的语法

     

在'(Dataime)附近))UNION ALL(

1 个答案:

答案 0 :(得分:1)

您需要进行一些更改才能使此查询正常工作:

  • 将内部SELECT个查询包装到另一个SELECT *查询中以使JOIN有效,例如() SP LEFT JOIN () SP不是有效的语法。相反,请使用SELECT * FROM (..) SP JOIN (..) FP
  • SP.*移除SELECT SP FPSELECT *仅对内部查询可见,请使用WHERE SP.Service=FP.Service
  • 再次从WHERE子句中移除SPFPSELECT * FROM ( ( SELECT * FROM (SELECT Service, SUM(Processed) as Second_Period, COUNT(Processed) as TRX_SP FROM pay WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-07 00:00:00' and '2017-05-14 00:00:00' GROUP BY Service) SP RIGHT JOIN (SELECT Service, SUM(Processed) as First_Period, COUNT(Processed) as TRX_FP FROM pay WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-01 00:00:00' and '2017-05-06 00:00:00' GROUP BY Service) FP USING (Service)) UNION ALL ( SELECT * FROM (SELECT Service, SUM(Processed) as Second_Period, COUNT(Processed) as TRX_SP FROM pay WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-07 00:00:00' and '2017-05-14 00:00:00' GROUP BY Service) SP LEFT OUTER JOIN (SELECT Service, SUM(Processed) as First_Period, COUNT(Processed) as TRX_FP FROM pay WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-01 00:00:00' and '2017-05-06 00:00:00' GROUP BY Service) FP USING (Service) )) as tbl2 GROUP BY Service Order BY Service 将不会显示。

以下查询应该有效:

USING

<强>更新

您不能在USING子句中使用函数,因此您需要为该列添加别名并使用SELECT * FROM ( ( SELECT * FROM (SELECT DAYNAME(Dataime) as 'day', SUM(Processed) as Second_Period, COUNT(Processed) as TRX_SP FROM pay WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-07 00:00:00' and '2017-05-14 00:00:00' GROUP BY DAYNAME(Dataime)) SP RIGHT JOIN (SELECT DAYNAME(Dataime) as 'day', SUM(Processed) as First_Period, COUNT(Processed) as TRX_FP FROM pay WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-01 00:00:00' and '2017-05-06 00:00:00' GROUP BY DAYNAME(Dataime)) FP USING(`day`)) UNION ALL ( SELECT * FROM (SELECT DAYNAME(Dataime) as `day`, SUM(Processed) as Second_Period, COUNT(Processed) as TRX_SP FROM pay WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-07 00:00:00' and '2017-05-14 00:00:00' GROUP BY DAYNAME(Dataime)) SP LEFT OUTER JOIN (SELECT DAYNAME(Dataime) as `day`, SUM(Processed) as First_Period, COUNT(Processed) as TRX_FP FROM pay WHERE Status1='Processed' AND Dataime BETWEEN '2017-05-01 00:00:00' and '2017-05-06 00:00:00' GROUP BY DAYNAME(Dataime)) FP USING (`day`) )) as tbl2 GROUP BY `day` Order BY `day` 中的别名,例如:

behavior: url(#default#VML);                   -> ignored wrong ending
background-image: url(dog.ttf);                -> ignored wrong ending
background-image: url('cat.png');              -> cat.png
background-image: url(bird.gif);               -> bird.gif
background-image: url('../monkey.png');        -> monkey.png
background-image: url('../../rab$bit.png');    -> rab$bit.png
background-image: url('../animal/cow.jpg');    -> cow.jpg