【问题标题】:Use id column of parent query in subquery mysql在子查询mysql中使用父查询的id列
【发布时间】:2018-11-20 10:15:57
【问题描述】:

我有这个查询(有效):

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 子句中使用 zone table 中的 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 调用外层 id。您需要重写查询
  • 您能告诉我正确的方法吗?提前致谢

标签: mysql nested-queries


【解决方案1】:

除了 appuntamenti.id_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

【讨论】:

  • 它是正确的,但结果只有一行,我需要为每个 appuntamenti.id_zona.. 我怎么能得到这个?提前致谢
  • 没有输入数据的布局有点难。尝试从 GROUP BY 中删除 AMPM,看看这是否为您指明了正确的方向。如果您使用一些示例数据和我的查询设置sqlfiddle.com,我可以提供帮助
【解决方案2】:

一般来说,要检查子查询是否有效,它应该可以自己运行。

所以在你的情况下,这个查询应该是成功的:

(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 会有所帮助:)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多