SQL 左鏈接(left join) 排序 分頁 中遇到的未按理想狀態排序分頁的解決方案

SELECT a.id AS "id", a.code AS "code", a.name AS "name", a.type AS "type", a.importance_degree AS "importanceDegree", a.tech_state AS "techState", a.customerid AS "customerid", a.departmentid AS "departmentid", a.project_managerid AS "projectManagerid", a.plan_starttime AS "planStarttime", a.plan_endtime AS "planEndtime", a.state AS "state", a.act_starttime AS "actStarttime", a.act_endtime AS "actEndtime", a.sending_time AS "sendingTime", a.old_plan_starttime AS "oldPlanStarttime", a.old_plan_endtime AS "oldPlanEndtime", a.delivery_time AS "deliveryTime", a.complete_status AS "completeStatus", a.marketerid AS "marketerid", a.create_by AS "createBy.id", a.create_date AS "createDate.id", a.update_by AS "updateBy.id", a.update_date AS "updateDate.id", a.remarks AS "remarks", a.del_flag AS "delFlag", department.id AS "department.id", department.name AS "department.name", projectManager.id AS "projectManager.id", projectManager.name AS "projectManager.name", projectManager.mobile AS "projectManager.mobile", marketer.id AS "marketer.id", marketer.name AS "marketer.name", marketer.mobile AS "marketer.mobile", customer.id AS "customer.id", customer.code AS "customer.code", customer.name AS "customer.name", push.id AS "push.id", push.projectid AS "push.project.id", push.userid AS "push.user.id", push.is_readed AS "push.isReaded"
FROM (SELECT * FROM ps_project WHERE del_flag = 0 ORDER BY code DESC limit 2,2) a
LEFT JOIN ps_customer customer ON a.customerid = customer.id
LEFT JOIN sys_office department ON a.departmentid = department.id
LEFT JOIN sys_user projectManager ON a.project_managerid = projectManager.id
LEFT JOIN sys_user marketer ON a.marketerid = marketer.id
LEFT JOIN ps_project_push push ON a.id = push.projectid 
AND push.del_flag = 0 
AND customer.del_flag= 0 
AND department.del_flag= 0 
AND projectManager.del_flag= 0 
AND marketer.del_flag= 0

語句目標:
    以主表排序後並進行分頁,然後再去鏈接其它表
出現問題:
    最終主表並無按照預想進行順序輸出,可是分頁的數據是正確的。
來自  stackflow 解答:

No, the JOIN by order is changed during optimization. mysql

個人解決辦法(經測試有效) sql

分頁排序在主表中進行,這樣就mysql在執行的過程當中分根據咱們的理想按字段排序且選出指定分頁。 測試

可是在Join時,mysql系統作了優化,因此最終出來的結果又是亂序,此時,對最終被mysql Join打亂的結果順序再作一次排序,這樣就能獲得咱們想要的結果了。 優化

SELECT a.id AS "id", a.code AS "code", a.name AS "name", a.type AS "type", a.importance_degree AS "importanceDegree", a.tech_state AS "techState", a.customerid AS "customerid", a.departmentid AS "departmentid", a.project_managerid AS "projectManagerid", a.plan_starttime AS "planStarttime", a.plan_endtime AS "planEndtime", a.state AS "state", a.act_starttime AS "actStarttime", a.act_endtime AS "actEndtime", a.sending_time AS "sendingTime", a.old_plan_starttime AS "oldPlanStarttime", a.old_plan_endtime AS "oldPlanEndtime", a.delivery_time AS "deliveryTime", a.complete_status AS "completeStatus", a.marketerid AS "marketerid", a.create_by AS "createBy.id", a.create_date AS "createDate.id", a.update_by AS "updateBy.id", a.update_date AS "updateDate.id", a.remarks AS "remarks", a.del_flag AS "delFlag", department.id AS "department.id", department.name AS "department.name", projectManager.id AS "projectManager.id", projectManager.name AS "projectManager.name", projectManager.mobile AS "projectManager.mobile", marketer.id AS "marketer.id", marketer.name AS "marketer.name", marketer.mobile AS "marketer.mobile", customer.id AS "customer.id", customer.code AS "customer.code", customer.name AS "customer.name", push.id AS "push.id", push.projectid AS "push.project.id", push.userid AS "push.user.id", push.is_readed AS "push.isReaded"
FROM (SELECT * FROM ps_project WHERE del_flag = 0 ORDER BY code DESC  limit 0,2 ) a
LEFT  JOIN ps_customer customer ON a.customerid = customer.id
LEFT  JOIN sys_office department ON a.departmentid = department.id
LEFT  JOIN sys_user projectManager ON a.project_managerid = projectManager.id
LEFT  JOIN sys_user marketer ON a.marketerid = marketer.id
LEFT  JOIN ps_project_push push ON a.id = push.projectid 
AND push.del_flag = 0 AND customer.del_flag= 0 AND department.del_flag= 0 AND projectManager.del_flag= 0 AND marketer.del_flag= 0
ORDER BY code DESC
相關文章
相關標籤/搜索