Используйте столбец id родительского запроса в подзапросе mysql - PullRequest
0 голосов
/ 20 ноября 2018

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

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.

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

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'в' где пункт '

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

Ответы [ 2 ]

0 голосов
/ 20 ноября 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
0 голосов
/ 20 ноября 2018

Правильно ли я вижу, что все элементы объединения такие же, как 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
...