按数据库中的分组日期排序

时间:2011-09-29 22:17:16

标签: php mysql sql database

你对这个问题有类似的问题

Tricky "grouped" ordering in SQL

但似乎无法使用日期

我的表格

Car_ID   Car_Brand   Car_Model   Car_launch_date
   1     Ford        Fiesta      12-12-2011
   2     Ford        Mustang     09-04-2008
   3     Ford        Focus       10-02-2012
   4     Honda       Civic       11-05-2012
   6     Honda       Jazz        02-05-2011
   7     Toyota      Prius       11-10-2011

我希望我的搜索结果按照最接近现在的未来日期排序,然后是最接近现在的过去日期(并按品牌分组)

我希望我的输出是这样的:

Car_ID   Car_Brand   Car_Model   Car_launch_date
   7     Toyota      Prius       11-10-2011
   1     Ford        Fiesta      12-12-2011
   3     Ford        Focus       10-02-2012
   2     Ford        Mustang     09-04-2008
   4     Honda       Civic       11-05-2012
   6     Honda       Jazz        02-05-2011

2 个答案:

答案 0 :(得分:1)

您在数据库中的日期是DATE个对象还是字符串?因为如果您尝试将它们作为字符串进行排序,那将无效!

如果日期为DATE s,请尝试:

SELECT * from my_table
ORDER BY Car_Brand DESC, 
         Car_launch_date < NOW(), 
         ABS(DATEDIFF(Car_launch_date, NOW()))

如果它们是字符串,请尝试:

SELECT * from my_table
ORDER BY Car_Brand DESC, 
         DATE(Car_launch_date) < NOW(), 
         ABS(DATEDIFF(DATE(Car_launch_date), NOW()))

如果您在订单中指定了多个列,则按第一列排序,然后按第一列排序,如果第一列中的值相同。

这个命令由   - 那么汽车品牌   - 日期是否过去。 Falses是先订购的。 (那么未来首先),然后   - 日期的绝对差异(最小的数字)

注意:我放了Car_Brand DESC(反向alpha顺序)因为你就是这样的。

感谢OP发现您想要更复杂的订单。但我认为这种方式更好:)

答案 1 :(得分:0)

使用以前的帖子作为补充,更好的答案是:

GROUP BY Car_Brand 
ORDER BY 
CASE WHEN Car_launch_date >= NOW() THEN 0 ELSE 1 END, 
CASE WHEN Car_launch_date >= NOW() THEN DATEDIFF(Car_launch_date, NOW()) ELSE DATEDIFF(NOW(), Car_launch_date) END

查询使用条件语句首先确定它是未来还是过去的日期。如果它是未来,它输出0并经过它输出1,所以未来的日期将排序第一,过去的日期排序第二。接下来是另一个案例陈述,用于检测如何计算现在和发布日期之间的天数差异。