在子查询mysql中使用父查询的id列

时间:2018-11-20 10:15:58

标签: mysql nested-queries

我有这个查询(有效):

SELECT NOME, AMPM, GROUP_CONCAT(CONCAT(PERITI,' (',QTY,')') SEPARATOR ', ')periti FROM 
(SELECT zone.nome, DATE_FORMAT(CONCAT(appuntamenti.data_inizio,' ',appuntamenti.ora_inizio), '%p') AMPM, 
periti.sigla PERITI,COUNT(*) QTY FROM appuntamenti 
inner join periti on appuntamenti.id_perito = periti.id 
inner join zone on appuntamenti.id_zona = zone.id 
where appuntamenti.data_inizio='2018-11-20' and appuntamenti.id_zona = '77'
GROUP BY AMPM, PERITI) AS GIORNO1AM
union
SELECT NOME, AMPM, GROUP_CONCAT(CONCAT(PERITI,' (',QTY,')') SEPARATOR ', ')periti FROM 
(SELECT zone.nome, DATE_FORMAT(CONCAT(appuntamenti.data_inizio,' ',appuntamenti.ora_inizio), '%p') AMPM, 
periti.sigla PERITI,COUNT(*) QTY FROM appuntamenti 
inner join periti on appuntamenti.id_perito = periti.id 
inner join zone on appuntamenti.id_zona = zone.id 
where appuntamenti.data_inizio='2018-11-20' and appuntamenti.id_zona = '78'
GROUP BY AMPM, PERITI) AS GIORNO1AM
union
SELECT NOME, AMPM, GROUP_CONCAT(CONCAT(PERITI,' (',QTY,')') SEPARATOR ', ')periti FROM 
(SELECT zone.nome, DATE_FORMAT(CONCAT(appuntamenti.data_inizio,' ',appuntamenti.ora_inizio), '%p') AMPM, 
periti.sigla PERITI,COUNT(*) QTY FROM appuntamenti 
inner join periti on appuntamenti.id_perito = periti.id 
inner join zone on appuntamenti.id_zona = zone.id 
where appuntamenti.data_inizio='2018-11-20' and appuntamenti.id_zona = '79'
GROUP BY AMPM, PERITI) AS GIORNO1AM
order by NOME ASC

我想从查询中删除所有“联盟”,而在嵌套where子句的区域表中使用 id列

类似:

SELECT p.id ,(SELECT NOME, AMPM, GROUP_CONCAT(CONCAT(PERITI,' (',QTY,')') SEPARATOR ', ')periti FROM 
(SELECT zone.nome, DATE_FORMAT(CONCAT(appuntamenti.data_inizio,' ',appuntamenti.ora_inizio), '%p') AMPM, 
periti.sigla PERITI,COUNT(*) QTY FROM appuntamenti 
inner join periti on appuntamenti.id_perito = periti.id 
inner join zone on appuntamenti.id_zona = zone.id 
where appuntamenti.data_inizio='2018-11-20' and appuntamenti.id_zona = p.id
GROUP BY AMPM, PERITI) AS GIORNO1AM) AS RISULTATO
FROM zone p

但是...当我尝试此更改时,出现此错误:

  

1054-“ where子句”中的未知列“ p.id”

请帮助我:)

2 个答案:

答案 0 :(得分:1)

我是否正确地看到,除appuntamenti.id_zona之外,并集的所有元素都相同?如果是这样,那行不通:

SELECT NOME, AMPM, GROUP_CONCAT(CONCAT(PERITI,' (',QTY,')') SEPARATOR ', ')periti FROM 
(SELECT zone.nome, DATE_FORMAT(CONCAT(appuntamenti.data_inizio,' ',appuntamenti.ora_inizio), '%p') AMPM, 
periti.sigla PERITI,COUNT(*) QTY FROM appuntamenti 
inner join periti on appuntamenti.id_perito = periti.id 
inner join zone on appuntamenti.id_zona = zone.id 
where appuntamenti.data_inizio='2018-11-20' and appuntamenti.id_zona IN (77, 78,79)
GROUP BY AMPM, PERITI) AS GIORNO1AM

答案 1 :(得分:0)

通常,要检查子查询是否正常运行,应自行运行该子查询。

因此,在您的情况下,此查询应该成功:

from pyspark.sql.functions import *
df = spark.table("HIVE_DB.HIVE_TABLE")
df.agg(min(col("col_1")), max(col("col_1")), min(col("col_2")), max(col("col_2"))).show()

在上面的查询中,没有名为(SELECT zone.nome,         Date_format(Concat(appuntamenti.data_inizio, ' ',                      appuntamenti.ora_inizio), '%p'          ) AMPM,          periti.sigla PERITI,          Count(*) QTY    FROM  appuntamenti    INNER JOIN periti     ON appuntamenti.id_perito = periti.id    INNER JOIN zone          ON appuntamenti.id_zona = zone.id    WHERE  appuntamenti.data_inizio = '2018-11-20'           AND appuntamenti.id_zona = p.id    GROUP  BY ampm,            periti) 的表。

我不确定您想要获得什么结果,SQL Fiddle会有所帮助:)

但是假设您要将子查询连接到外部表,则需要 INNER JOIN

p