带有复杂ORDER BY的MySQL查询

时间:2012-10-05 13:17:57

标签: php mysql

我有以下查询:

SELECT id, title, adcontent, adtargetURL, locationpage, 
locationarg, locationid, displayorder, visible, schedstart, 
schedstop, created, modified, createdby, modifiedby
FROM ads            
ORDER BY locationpage, locationarg, locationid, title 

我需要按以下方式订购字段:

  • 按位置排序,首先使用值为'all'的任何字段,然后按升序排列其余字段
  • 然后通过locationarg首先使用任何NULL或空字符串值,然后将其余部分保存在asc
  • 然后通过locationid首先使用任何NULL或0值,其余部分在asc
  • 并在其中,首先按“1”的displayorder排序,然后按NULL,然后按“2”
  • 最后,如果其中任何一个都是相同的,则按ASC中的标题

我的ORDER BY应该如何实现这一目标?

这是我到目前为止所做的:(从下面更新)

ORDER BY locationpage='all', 
         locationpage ASC, 
         locationarg ASC, 
         locationid ASC, 
         displayorder='1', 
         ISNULL(displayorder), 
         displayorder='2', 
         title ASC

......但这不起作用!

2 个答案:

答案 0 :(得分:1)

您最好的选择是使用一个计算字段,根据您的规则生成订单ID。我稍后会添加一个示例..

select
case
  when locationpage = "all" then 10
  when ISNULL(locationarg)  then 20
  ....
  else 50 
end as OrderID,
id, 
title, 
....

FROM ads            

ORDER BY OrderID DSEC

答案 1 :(得分:0)

给这个打击:

select id, title, adcontent, adtargetURL, locationpage, locationarg, locationid, displayorder, visible, schedstart, schedstop, created, modified, createdby, modifiedby 
from ads
order by case when locationpage='all' then 0 else 1 end, 
         locationpage, 
         case when locationarg is null or locationarg='' then 0 else 1 end,
         locationarg ASC, 
         case when locationid is null OR locationid='0' then 0 else 1 end, 
         locationid, 
         case when displayorder =1 then 0 when displayorder is null then 1 when displayorder = 2 then 2 else 3 end,
         title;