MySQL根据列的内容更改顺序

时间:2011-06-17 14:44:00

标签: asp.net mysql sql sql-order-by

我有一个包含2列的MySQL表页面:PageID和OrderByMethod。 然后我还有一个包含许多列的数据表,包括PageID(数据所在的页面),DataName和DataDate。

我希望OrderByMethod有三个条目之一:最新数据优先,最新数据最后和按字母顺序排列。

我是否有办法在此查询结尾处添加“ORDER BY”子句,该子句将根据“OrderByMethod”列的内容改变其排序方法?例如,在这个查询中,我希望让ORDER BY子句包含存储在Page 1的OrderByMethod列中的任何排序规则。

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

或许ORDER BY子句中的SELECT子句?我不确定那会怎么样。

谢谢!

4 个答案:

答案 0 :(得分: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

中指定方向

答案 1 :(得分: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)
);

答案 2 :(得分:0)

您可以将order by子句附加到select语句并在回发时重新绑定表吗?

答案 3 :(得分:0)

如果要将Page表中列的内容用作ORDER BY中的表达式,则必须使用预准备语句。假设您在OrderByMethod中存储类似“field1 DESC,field2 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的值对结果集进行排序,则可以使用其他人已提及的IFCASE

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