【问题标题】:How to use join and union for sub queries in mysql如何在mysql中使用join和union进行子查询
【发布时间】:2017-10-30 19:05:36
【问题描述】:

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

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 Service, SUM(Processed) as First_Period, COUNT(第 16 行处理'

我做错了什么?我使用左和右连接和联合,因为我不能在 mysql 中使用完全外连接。

更新

这里是用 DAYNAME(Dataime) 代替 Service 的 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 服务器版本相对应的手册,了解正确使用的语法

near '(Dataime))) UNION ALL (

【问题讨论】:

  • 如果单独执行第二个查询,它工作正常吗?
  • @DarshanMehta 是的,它有效。我已经单独尝试了两个子查询,它们都有效。

标签: mysql join subquery union


【解决方案1】:

您需要进行一些更改才能使此查询起作用:

  • 将内部SELECT 查询包装到另一个SELECT * 查询中以使JOIN 工作,例如() SP LEFT JOIN () SP 不是有效的语法。相反,使用SELECT * FROM (..) SP JOIN (..) FP
  • 从外部SELECT 中删除SP.*,因为SPFP 仅对内部查询可见,请改用SELECT *
  • 再次从外部WHERE 子句中删除WHERE SP.Service=FP.ServiceSPFP 将不可见。

下面的查询应该可以工作:

SELECT *
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`

【讨论】:

  • 非常感谢。它适用于服务。显然,我认为它不需要全选作为表格,但从您的示例中我了解到需要将所有内容视为表格以便合并它们。现在,如果我不想用DAYNAME(MyDate) 替换服务,那么在你放在这里的同一个查询中使用一个星期天名称,它就行不通了。日期格式有不同的方式吗?
  • 不确定我是否理解正确,但如果您想添加另一列,则需要在内部SELECTs 和GROUP BY 上添加它,例如SELECT Service, DAYNAME(Dataime) .... GROUP BY Service, DATE(Dataime).
  • 我用DAYNAME(Dataime) 替换了Service 这是...(SELECT DAYNAME(Dataime), SUM(Processed) as Second_Period, ...GROUP BY DAYNAME(Dataime)) SP....GROUP BY DAYNAME(Dataime) Order BY DAYNAME(Dataime) 的示例,但它不起作用。它在 UNION ALL 中返回错误
  • 您需要在两个查询中都这样做。你能用错误信息更新问题吗?
  • 这在很大程度上取决于可用数据和日期,我认为您应该对date 进行分组,而不是日期名称。由于我不知道这些查询和数据的完整背景,因此我很难发表评论。
猜你喜欢
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 1970-01-01
相关资源
最近更新 更多