【问题标题】:How to perform calculation on the topmost returned row in MySql?如何对 MySql 中返回的最顶层行执行计算?
【发布时间】:2020-08-19 14:51:03
【问题描述】:

我编写了以下查询,其中使用order by 子句返回行:

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; 

有几种不同类型的输出,如下所示:

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

【问题讨论】:

    标签: mysql join select sql-order-by inner-join


    【解决方案1】:
    SELECT host.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
    GROUP BY hostname;
    

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 2010-10-11
      • 2016-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      相关资源
      最近更新 更多