Использовать столбец id родительского запроса в подзапросе mysql

у меня есть этот запрос (работает):

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

я хочу удалить все объединение из запроса и использовать вместо него столбец id из таблицы зон во вложенном предложении where.

что-то вроде :

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 – Неизвестный столбец "p.id" в разделе "где"

пожалуйста, помогите мне :)


person Torgia    schedule 20.11.2018    source источник
comment
Вы не можете ссылаться на столбцы внешнего уровня глубже, чем на один уровень, и вы пытаетесь вызвать внешний идентификатор с уровня 2. Вам нужно будет переписать запрос   -  person Jarek.D    schedule 20.11.2018
comment
не могли бы вы сказать мне правильный способ сделать это? заранее спасибо   -  person Torgia    schedule 20.11.2018


Ответы (2)


Я правильно понимаю, что все элементы объединения одинаковы, кроме 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
person Jarek.D    schedule 20.11.2018
comment
это правильно, но в результате получается только одна строка, мне нужна одна строка для каждого appuntamenti.id_zona.. как я могу это получить? заранее спасибо - person Torgia; 20.11.2018
comment
Это немного сложно, не имея макета входных данных. Попробуйте удалить AMPM из GROUP BY и посмотрите, укажет ли это вам в правильном направлении. Я мог бы помочь, если бы вы создали sqlfiddle.com с некоторыми примерами данных и моим запросом. - person Jarek.D; 20.11.2018

В общем, чтобы проверить, работает ли подзапрос, он должен запускаться сам по себе.

Итак, в вашем случае этот запрос должен быть успешным:

(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
person naribo    schedule 20.11.2018