2011-12-22 56 views
2

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

问候

菲尔

编辑

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)< 3 THEN DATE_ADDED ELSE NULL,PROD_NAME LIMIT 0 ,第11行6'

任何人都知道为什么?

+0

我觉得自己很蠢。我在阅读并错误理解你的问题后添加了一条评论。我不知道这是否可能。但即使是这样,使用两种不同的查询代码将更容易阅读吗? – 2011-12-22 08:42:06

+0

对于两个单独的查询,它可能也会更快,尤其是如果您从不需要显示“其余”(因为它只从第4页开始)。 – Thilo 2011-12-22 08:43:49

回答

1

使用MySQL的语法:

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

无需编辑,就在钱上! – 2011-12-22 10:59:11

3

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

伪代码(在一些近似T-SQL)

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

如果“ProductDate”是TIMESTAMP或DATESTAMP,会影响吗? – 2011-12-22 09:56:34

+0

您正在使用哪种RDBMS?假设您使用的是SQL Server,那么当使用TIMESTAMP创建记录时,您无法计算出它 - 它不会对日期或时间进行编码 - 它只是一个递增的数字。在我知道的任何RDBMS中没有DATESTAMP数据类型这样的事情。 – 2011-12-22 10:34:37

+0

刚刚在phpMyAdmin中检查,类型是DATETIME。我似乎无法得到上述工作。我会在我的问题中编辑一个编辑 – 2011-12-22 10:42:01

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 
+0

不需要第二和第三排序栏的情况。 – Thilo 2011-12-22 08:38:39

+1

@Thilo:是的,有。否则所有记录将按日期排序。 – Guffa 2011-12-22 08:43:50

相关问题