先按最后3个月排序,然后按字母顺序排序

时间:2011-12-22 08:27:52

标签: mysql sql-order-by case

我被要求在网站上订购产品,以便在过去3个月内首先显示任何产品(从最近的产品开始),然后是其他产品。目前该网站是按类编写的,目前产品按日期添加。为了减少工作量,我想知道上述是否可以在一个SQL查询中完成?我认为它需要2个单独的查询,但我不是sql的专家,所以想知道是否可以这样做?

问候

菲尔

修改

SELECT pr.id, pr.name AS prod_name, pr.eye_size, pr.bridge_size, pr.opt_size, pr.price, pr.range_id, pr.date_added, ra.name AS range_name
FROM oa_product AS pr, oa_brand AS br, oa_range AS ra
WHERE pr.status = 'Launched'
AND pr.brand_id = br.id
AND br.filename = 'karenmillen'
AND pr.status = 'Launched'
AND pr.range_id = ra.id
AND br.status = 'Active'
ORDER BY
CASE WHEN DATEDIFF( 'm', GETDATE(
), date_added ) <3
THEN date_added
ELSE NULL , prod_name
LIMIT 0 , 6

获取错误 MySQL服务器版本以便在'date_added'附近使用正确的语法&lt; 3 THEN date_added ELSE NULL,prod_name LIMIT 0,6'在第11行

谁知道为什么?

3 个答案:

答案 0 :(得分:3)

您可以使用CASE语句将超过3个月的所有产品日期视为相等。

伪代码(近似于T-SQL的东西)

SELECT ProductName, ProductDate
FROM   Products
ORDER BY 
  CASE WHEN DATEDIFF ('m', GETDATE(), ProductDate) < 3 THEN ProductDate 
       ELSE NULL,
  ProductName

答案 1 :(得分:1)

使用MySQL语法:

select * from Products order by DateColumn > curdate() - interval 3 month desc, ProductName;

答案 2 :(得分:0)

您不需要两个单独的查询。您可以创建一个表达式,首先对最近的产品进行排序,然后使用表达式对它们进行不同的排序:

...
order by
  case when ProductDate < adddate(month, -3, getdate()) then 1 else 2 end,
  case when ProductDate < adddate(month, -3, getdate()) then ProductDate else null end desc,
  case when ProductDate < adddate(month, -3, getdate()) then null else ProductName end