Mysql之group by GROUP_CONCAT的保證順序

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取值後進行賦值。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章