MySQL, изменяющий порядок в зависимости от содержимого столбца - PullRequest
0 голосов
/ 17 июня 2011

У меня есть страница таблицы MySQL с 2 столбцами: PageID и OrderByMethod.Затем у меня также есть таблица данных с большим количеством столбцов, включая PageID (страница, на которой находятся данные), DataName и DataDate.

Я хочу, чтобы в OrderByMethod была одна из трех записей: «Последние данные - сначала», «Последние»Данные в последнюю очередь и в алфавитном порядке.

Есть ли способ добавить в конец этого запроса предложение «ORDER BY», которое будет изменять метод упорядочения в зависимости от содержимого столбца «OrderByMethod»?Например, в этом запросе я хотел бы, чтобы предложение ORDER BY содержало любое правило порядка, хранящееся в столбце OrderByMethod на странице 1.

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

Может быть, предложение SELECT в предложении ORDER BY?Я не уверен, как это будет работать.

Спасибо!

Ответы [ 4 ]

1 голос
/ 17 июня 2011

Вероятно, вы можете сделать это с синтаксисом 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 голос
/ 17 июня 2011
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 голосов
/ 17 июня 2011

Если вы хотите использовать содержимое столбца в таблице 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 
0 голосов
/ 17 июня 2011

Можете ли вы просто добавить предложение order by к предложению select и заново связать таблицу при обратной передаче?

...