Как запустить запрос внутреннего соединения с несколькими значениями регулярного выражения в MySql? - PullRequest
0 голосов
/ 06 мая 2020

Я написал следующий запрос, и он отлично работает для одного hostname

SELECT 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 LIMIT 1
) AS temp;

Я получаю следующий результат:

hostname    orderId status     Heading          Detail
abc.com     3       Finished

Я хочу запустить тот же запрос для нескольких имен хостов. Я выполняю изменение REGEXP, как показано ниже, но он по-прежнему возвращает тот же результат, что и выше, и имеет только один hostname

WHERE  host.hostname REGEXP '^(abc|cde|efg)'

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

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

Пример данных:

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

1 Ответ

1 голос
/ 06 мая 2020

Вам необходимо удалить LIMIT 1 из производной таблицы temp, поскольку это ограничивает вас одной выходной строкой. Затем вы можете JOIN таблицу temp преобразовать в производную таблицу минимальных значений orderId для каждого hostname, чтобы получить строку с минимальным orderId для каждого хоста:

JOIN (
  SELECT hostname, MIN(cb.orderId) AS orderId
  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'
  GROUP BY hostname
) m ON m.hostname = temp.hostname AND m.orderId = temp.orderId
...