2011-06-17 24 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