MySql Внутреннее соединение выдает ошибку - Неизвестный столбец 'host.hostname' в 'field list' - PullRequest
0 голосов
/ 05 мая 2020

Моя таблица может иметь разные типы вывода, как показано ниже:

hostname    orderId status  Heading         Detail
abc.com     3       30      HeadingA        Details1
abc.com     5       40      HeadingB        Details2
... more rows

hostname    orderId status  Heading         Detail
cde.com     3       40      HeadingA        Details1
cde.com     5       30      HeadingB        Details2
... more rows

hostname    orderId status  Heading         Detail
efg.com     3       50      HeadingA        Details1
efg.com     5       30      HeadingB        Details2
... more rows

Я хочу выполнить вычисление status первой возвращенной строки, как показано ниже:

1) If `status is 30` then show status as `Finished`. Also `Heading` and `Detail` should be empty.

2) If `status is 40` or `status is 50` then show status as `Error`. `Heading` and `Detail` should show as such.

Желательно вывод выглядит следующим образом:

hostname    orderId status     Heading          Detail
abc.com     3       Finished

hostname    orderId status  Heading         Detail
cde.com     3       Error   HeadingA        Details1

hostname    orderId status  Heading         Detail
efg.com     3       Error   HeadingA        Details1

Я написал следующий запрос, чтобы получить желаемый результат:

SELECT host.hostname,orderId,
CASE WHEN status = 30 THEN 'Finished' ELSE 'Error' END 'status',
CASE WHEN status = 40 THEN '' ELSE Heading END 'Heading',
CASE WHEN status = 40 THEN '' ELSE Detail END 'Detail'
FROM
(
     SELECT host.hostname,
     cb.orderId,
     cb.status,
     cb.chefbook_name AS Heading,
     (
         SELECT log_message
         FROM   chefbookrun rr
         WHERE  rr.chefbook_id = c.id
         ORDER  BY id DESC 
         LIMIT 1 
     ) AS Detail 
     FROM host
     INNER JOIN host_infl hif ON host.vc_server_id = hif.vc_server_id
     INNER JOIN chefcookbook cb ON hif.id = cb.host_id
     WHERE  host.hostname REGEXP 'abc'
     ORDER  BY cb.orderId
) AS temp
GROUP BY hostname;

Но он дает ошибку:

Unknown column 'host.hostname' in 'field list'  

Пожалуйста, дайте мне знать, нужно ли мне использовать aggregate Group By в моем запросе, потому что если я удалю запрос, он не будет ошибочным.

SELECT temp.hostname,
       orderId,
       CASE WHEN status = 30 THEN 'Finished' ELSE 'Error' END 'status',
       CASE WHEN status = 30 THEN '' ELSE Heading END 'Heading',
       CASE WHEN status = 30 THEN '' ELSE Detail END 'Detail'
FROM(SELECT host.hostname,
            cb.orderId,
            cb.status,
            cb.chefbook_name AS Heading,
            (SELECT log_message
             FROM   chefbookrun rr
             WHERE  rr.chefbook_id = c.id
             ORDER  BY id DESC 
             LIMIT 1 ) AS Detail 
     FROM host
     INNER JOIN host_infl hif ON host.vc_server_id = hif.vc_server_id
     INNER JOIN chefcookbook cb ON hif.id = cb.host_id
     WHERE  host.hostname REGEXP 'abc'
     ORDER  BY cb.orderId
) AS temp;

1 Ответ

0 голосов
/ 05 мая 2020

Вам нужно использовать temp вместо host. Также вам не нужно предложение GROUP BY, так как нет предложения Aggregate -

SELECT temp.hostname,
       orderId,
       CASE WHEN status = 30 THEN 'Finished' ELSE 'Error' END 'status',
       CASE WHEN status = 30 THEN '' ELSE Heading END 'Heading',
       CASE WHEN status = 30 THEN '' ELSE Detail END 'Detail'
FROM(SELECT host.hostname,
            cb.orderId,
            cb.status,
            cb.chefbook_name AS Heading,
            (SELECT log_message
             FROM   chefbookrun rr
             WHERE  rr.chefbook_id = c.id
             ORDER  BY id DESC 
             LIMIT 1 ) AS Detail 
     FROM host
     INNER JOIN host_infl hif ON host.vc_server_id = hif.vc_server_id
     INNER JOIN chefcookbook cb ON hif.id = cb.host_id
     WHERE  host.hostname REGEXP 'abc'
     ORDER  BY cb.orderId
) AS temp;
...