2011-06-17 58 views
0

我有一個包含2列的MySQL表頁:PageID和OrderByMethod。 我也有一個數據表,包含很多列,包括PageID(數據頁面),DataName和DataDate。MySQL根據列的內容更改順序

我想OrderByMethod有三個條目之一:最近的數據第一,最近的數據最後,和按字母順序。

有沒有辦法讓我在這個查詢的末尾加上一個「ORDER BY」子句,它會根據「OrderByMethod」列的內容改變它的排序方法?例如,在這個查詢中,我希望ORDER BY子句包含存儲在Page 1的OrderByMethod列中的任何排序規則。

GET * FROM `Data` WHERE `Data`.`PageID`=1 ORDER BY xxxxxx; 

ORDER BY子句中可能有一個SELECT子句?我不確定那將如何工作。

謝謝!

回答

1
select Data.* 
from Data 
inner join Page on (Data.PageID=Page.PageID) 
where Data.PageID=1 
order by 
if(Page.OrderByMethod='Most Recent Data First', now()-DataDate, 
    if(Page.OrderByMethod='Most Recent Data Last', DataDate-now(), DataName) 
); 
+0

我怎麼會在按字母順序排列的選項中放入第三個「if」? – carlbenson

+0

不需要第三個IF,因爲'DataName'的意思是按字母順序排列 – ajreal

+0

啊!很有意思!我現在就試試看。 – carlbenson

0

你可以直接將order by子句附加到select語句,並在回發中重新綁定表嗎?

1

您可以使用IF語法做到這一點,以生成一個列,然後您可以按順序排列。

SELECT *, IF(Page.OrderBy = 'Alphabetically', Data.DataName, IF(Page.OrderBy = 'Most Recent Data First', NOW() - Data.DataDate, Data.DataDate - NOW())) AS OrderColumn 
FROM Data 
INNER JOIN Page ON Data.PageID = Page.PageID 
WHERE Page.PageID = 1 
ORDER BY OrderColumn 

排序的方向中的數據的計算來確定在ORDER BY

+0

我不知道你的意思。 – carlbenson

+0

@Carl Benson用代碼更新。我要去嘗試它,並用更多的信息更新答案 –

+0

也許某種如果在一個if? – carlbenson

0

指定的方向,而不是如果要使用的列的內容中Page表作爲在ORDER BY中的表達,你必須使用預處理語句來完成。讓我們說,你在OrderByMethod像「字段1 DESC,場2 ASC」存儲並要使用這個字符串,因爲它是:

SET @order_by =(SELECT OrderByMethod FROM Page WHERE id = [value]); 
SET @qr = CONCAT(your original query,' ORDER BY ', @order_by); 
PREPARE stmt FROM @qr; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

如果你想結果集的基礎上OrderByMethod值進行排序,你可以使用IF,因爲它已經被其他人所提到的,或CASE

... 
ORDER BY 
CASE OrderByMethod 
    WHEN 'val1' THEN field_name1 
    WHEN 'val2' THEN field_name2 
    ....etc 
END