Порядок изменения MySQL в зависимости от содержимого столбца

У меня есть страница таблицы MySQL с двумя столбцами: 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? Хотя я не уверен, как это сработает.

Спасибо!


person carlbenson    schedule 17.06.2011    source источник


Ответы (4)


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

person Brendan Bullen    schedule 17.06.2011
comment
@Carl Benson Обновлено с кодом. Я собираюсь попробовать и обновить ответ с дополнительной информацией - person Brendan Bullen; 17.06.2011
comment
Возможно, что-то вроде if внутри if? - person carlbenson; 17.06.2011
comment
IF внутри IF возможен, но при этом данные в столбце должны быть реорганизованы таким образом, чтобы при упорядочении OrderBy поле сортировалось правильно. - person Brendan Bullen; 17.06.2011

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

person mrK    schedule 17.06.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 
person a1ex07    schedule 17.06.2011

person    schedule
comment
Как бы я добавил третью, если для опции «По алфавиту»? - person carlbenson; 17.06.2011
comment
нет необходимости в третьем IF, потому что DataName предназначен для алфавитного порядка - person ajreal; 17.06.2011
comment
ах! Очень интересно! Я попробую сейчас. - person carlbenson; 17.06.2011
comment
Очень элегантное и простое решение - большое спасибо за вашу помощь! - person carlbenson; 17.06.2011