【发布时间】:2019-12-13 14:31:06
【问题描述】:
我有一个相当复杂的 mySQL 查询,其中包含最终需要排序和分页的三个联合。用例是一个包含多列数据的网页。用户可以一次选择一列进行排序,方法是单击列的标题,然后翻阅结果。第二次单击标题会切换排序顺序。我的策略是传入字段($sortField)来指定字段和一个标志($sortOrder)来指定升序或降序。根据我的网络研究,我可以使用以下语句,但是当我添加更多排序选项时,我遇到了 sort_buffer 限制,并且担心此解决方案最终无法扩展。有没有人推荐更好的方法?似乎应该有一个相当直接的解决方案,但我似乎找不到它。
ORDER BY
CASE WHEN $sortField = 'fo_cd' AND $sortOrder = -1 THEN fo_cd END DESC,
CASE WHEN $sortField = 'fo_cd' and $sortOrder = 1 THEN fo_cd END,
CASE WHEN $sortField = 'fm_name' AND $sortOrder = -1 THEN fm_name END DESC,
CASE WHEN $sortField = 'fm_name' and $sortOrder = 1 THEN fm_name END,
CASE WHEN $sortField = 'fo_ld' AND $sortOrder = -1 THEN fo_ld END DESC,
CASE WHEN $sortField = 'fo_ld' and $sortOrder = 1 THEN fo_ld END,
CASE WHEN $sortField = 'us_creator' AND $sortOrder = -1 THEN us_creator END DESC,
CASE WHEN $sortField = 'us_creator' and $sortOrder = 1 THEN us_creator END,
CASE WHEN $sortField = 'us_assignedTo' AND $sortOrder = -1 THEN us_assignedto END DESC,
CASE WHEN $sortField = 'us_assignedTo' and $sortOrder = 1 THEN us_assignedto END,
CASE WHEN $sortField = 'fo_currentStatus' AND $sortOrder = -1 THEN fo_CurrentStatus END DESC,
CASE WHEN $sortField = 'fo_currentStatus' and $sortOrder = 1 THEN fo_CurrentStatus END,
CASE WHEN $sortField = 'fd_name1' AND $sortOrder = -1 THEN fd_name1 END DESC,
CASE WHEN $sortField = 'fd_name1' and $sortOrder = 1 THEN fd_name1 END,
CASE WHEN $sortField = 'fd_name2' AND $sortOrder = -1 THEN fd_name2 END DESC,
CASE WHEN $sortField = 'fd_name2' and $sortOrder = 1 THEN fd_name2 END,
CASE WHEN $sortField = 'fd_name3' AND $sortOrder = -1 THEN fd_name3 END DESC,
CASE WHEN $sortField = 'fd_name3' and $sortOrder = 1 THEN fd_name3 END,
CASE WHEN $sortField = 'fd_name4' AND $sortOrder = -1 THEN fd_name4 END DESC,
CASE WHEN $sortField = 'fd_name4' and $sortOrder = 1 THEN fd_name4 END
【问题讨论】:
-
数据集到底有多大?
-
@strawberry -- 目前规模不大,但增长迅速。这是一个更新的 SaaS 应用程序,我需要随着时间的推移进行扩展。我正在排序的结果是三联合选择的产物,因此这可能会增加一些复杂性。
标签: mysql sorting dynamic parameters