【问题标题】:MySQL dynamic ORDER BYMySQL 动态 ORDER BY
【发布时间】: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


【解决方案1】:

期待你的代码

确保您在代码中使用 var .. 您可以简单地使用动态 sql(但请注意广告适当清理 var 内容以避免 sqlinjection 风险)

"  ORDER BY " . $sortField . " CASE WHEN $sortOrder = -1  THEN 'DESC' ELSE ASC 'END' ";  

$asc_desc =  ($sortOrder == -1) ? 'DESC' : ASC 
"  ORDER BY " . $sortField . " " .  $asc_desc;  

【讨论】:

  • 感谢您的建议。我会调查这个;但是,正如您所建议的那样,这种模式可能会导致注入攻击,因此我尝试将参数保留为由 SPROC 处理的参数,而不是从字符串构造 SQL 语句。
猜你喜欢
  • 2017-01-30
  • 2012-01-19
  • 2015-02-26
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多