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

pkln4tw6  于 2021-06-19  发布在  Mysql
关注(0)|答案(2)|浏览(368)

我有这个问题(工作):

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

我想从查询中删除所有的“union”,并在嵌套的where子句中使用zone表中的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”

请帮帮我:)

qfe3c7zg

qfe3c7zg1#

我是否正确地认识到,除了appuntamenti.id\u zona之外,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 IN (77, 78,79)
GROUP BY AMPM, PERITI) AS GIORNO1AM
ogsagwnx

ogsagwnx2#

一般来说,要检查子查询是否工作,它应该可以自己运行。
因此,在您的情况下,此查询应该是成功的:

(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)

从上面的查询中,没有名为 p .
我不确定您想要获得什么样的结果,使用sql fiddle会有所帮助:)
但是假设要将子查询连接到外部表,则需要一个内部联接

SELECT p.id,
       subquery.nome
       group_concat(concat(periti, ' (', subquery.qty, ')') SEPARATOR ', ') periti
FROM   zone p 
INNER JOIN (
            SELECT zone.nome,
                   Date_format(Concat(appuntamenti.data_inizio,
                               ' ', vappuntamenti.ora_inizio), '%p'
                               ) AMPM, 
                   periti.sigla PERITI, 
                   Count(*)     QTY
                   appuntamenti.id_zona /* <- reference from outer table */         
            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' 
            GROUP  BY ampm,  periti) AS subquery ON subquery.id_zona = p.id

相关问题