2011-12-22 53 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

相關問題