group by分组后获得每组中符合条件的那条记录

时间:2022-01-17 15:10:42
当group by单独使用时,只显示出每组的第一条记录。
如下,未分组时查询出两条记录
SELECT
  info.id,
  info.switch_id,
  info.port_id,
  info.mac_addr,
  info.ip,
  info.rec_time,
  info.dev_name,
  info.is_active,
  info.port_type,
  info.real_type,
  cfg.port_describe,
  cfg.port_value,
  switchers.name,
  switchers.switch_ip
FROM
  (
    T_NET_SWITCHBOARD_PORT_INFO AS info
    LEFT JOIN T_NET_SWITCHBOARD_PORT_CFG AS cfg
      ON info.port_id = cfg.port_id
  )
  LEFT JOIN T_NET_SWITCHBOARD_CFG AS switchers
    ON info.switch_id = switchers.switch_id
WHERE info.mac_addr != ''
  AND info.`real_type` = 0
  AND info.port_type != 1
  AND info.dev_name LIKE "%"  "%"
  AND info.ip LIKE "%" "%"
  AND info.mac_addr LIKE "%"  "%"
  AND info.mac_addr LIKE '%00:10:7F:52:0D:FD%'

结果 

  id       switch_id  port_id  mac_addr               ip                         rec_time                 dev_name  is_active  port_type  real_type  port_describe          port_value  name                           switch_ip      
------  ---------  -------  -----------------  --------------  -------------------  --------  ---------  ---------  ---------  ---------------------  ----------  ----------------------------- 
 59591         18     3697  00:10:7F:52:0D:FD   168.160.15.197   2018-08-08 15:40:32                    0          2          0  GigabitEthernet5/0/2           33  地下UPS室-华为S9306                 168.160.15.66  
 59798         20     3758  00:10:7F:52:0D:FD                            2018-08-08 15:47:16                    0          0          0  GigabitEthernet0/0/14          19  地下总控室-华为S5700-1                168.160.15.76 

这个时候加上group by 默认加载显示第一条,如果我想要port_type最小的那条该如何实现?

 

先对分组前进行排序,然后再分组获取。

SELECT a.* FROM (SELECT
  info.id,
  info.switch_id,
  info.port_id,
  info.mac_addr,
  info.ip,
  info.rec_time,
  info.dev_name,
  info.is_active,
  info.port_type,
  info.real_type,
  cfg.port_describe,
  cfg.port_value,
  switchers.name,
  switchers.switch_ip
FROM
    T_NET_SWITCHBOARD_PORT_INFO AS info
  LEFT JOIN T_NET_SWITCHBOARD_PORT_CFG AS cfg
      ON info.port_id = cfg.port_id 
  LEFT JOIN T_NET_SWITCHBOARD_CFG AS switchers
      ON info.switch_id = switchers.switch_id
WHERE (info.mac_addr != ''
  AND info.`real_type` = 0
  AND info.port_type != 1
  AND info.mac_addr LIKE '%00:10:7F:52:0D:FD%')
  ORDER BY info.port_type -- 先排序再分组
  ) a
GROUP BY  a.mac_addr 
ORDER BY 
a.switch_ip,
a.port_describe