本文共 1343 字,大约阅读时间需要 4 分钟。
groub by 是按照分组,默认不排序,groub后会选择默认排序的第一条进行返回。
如果分组前排序好的数据,取排序好的第一条数据排序,则需要加上limit ,进行强制排序。
SELECT m.* from ( SELECT if ( a.status = 'X002', a.fleet_name , null) AS fleet_name,a.id AS enquiryid,a.enquiry_no,b.invoice_no,a.`status`, a.created_dt,b.pick_time,b.arrival_time,a.created_by,a.expect_offer_time,b.send_company,b.send_province, b.send_city,b.send_district,b.send_address,b.send_name,b.send_phone,b.recv_company,b.recv_province, b.recv_city,b.recv_district,b.recv_address,b.recv_name,b.recv_phone,a.publish_mode,a.freight_calculation_type,a.dead_line,a.consig_no FROM bill_enquiry a LEFT JOIN bill_invoice_item b ON a.invoice_id = b.invoice_id where a.status in ('X001','X002') and a.consig_id = 6598083868299887637 ORDER BY a.status desc limit 10000000000) m GROUP BY m.consig_no
上面的SQL会返回status排序的结果取第一条(即有X002,优先返回X002)。
但是如果查询中加入了GROUP_CONCAT(m.fleet_name) as fleet_names,则返回结果不是按照status排序的第一条数据返回。
GROUP_CONCAT(m.fleet_name order by m.fleet_name) 这个是指的concat按照指定顺序拼接。
下面是2个执行结果的截图,本应该返回X002的,加上GROUP_CONCAT后展示的为X001
最后通过Java程序进行配合处理,分2步groub排序的,跟GROUP_CONCAT的数据2个SQL执行。
SQL中去掉GROUP_CONCAT,如果是X002的则,再查询一下group中拼接的字段,遍历后Map取值后进行赋值。
转载地址:http://nxadi.baihongyu.com/