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取值后进行赋值。