我有一个包含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子句?我不确定那会怎么样。
谢谢!
答案 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
的值对结果集进行排序,则可以使用其他人已提及的IF
或CASE
:
...
ORDER BY
CASE OrderByMethod
WHEN 'val1' THEN field_name1
WHEN 'val2' THEN field_name2
....etc
END