2016-12-29 2 views
1

Учитывая следующую таблицу:Пусть значение поля направления устанавливается порядок сортировки в Mysql

CREATE TABLE `example` (
    `Identifier` int(11) NOT NULL AUTO_INCREMENT, 
    `FieldValue` varchar(255) DEFAULT NULL, 
    `FieldOrder` enum('asc','desc') DEFAULT 'asc', 
    PRIMARY KEY (`Identifier`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Я хочу, чтобы выполнить запрос, который сортирует FieldValue поля на основе значения в поле FieldOrder. Например.

Select * from example order by FieldValue [here should the FieldOrder value be placed] 

Возможно ли сделать ссылку на поле FieldOrder в сортировке по части запроса?

+1

Вопрос не достаточно ясна. Добавьте пример, чтобы показать, чего вы пытаетесь достичь. – GurV

+3

Как это работает, если таблица имеет две записи; один говорит, что он должен подниматься, и одно высказывание опускается? Просьба привести примеры ... – Mr47

+0

Что содержит 'FieldValue'? Случается, что это может содержать несколько значений (разделенных запятыми), может быть? Если да, то * не * хранить несколько значений в одном поле. Используйте таблицу ссылок и «нормализуйте» свою базу данных. –

ответ

2

Один из способов приблизиться к этому заключается в том, чтобы обрабатывать FieldValue как положительные или отрицательные значения для FieldOrder значений «asc» и «desc» соответственно. Это может быть выражено с помощью выражения case:

SELECT * 
FROM  example 
ORDER BY CASE FieldOrder WHEN 'asc' THEN 1 ELSE -1 END * FieldValue 
+0

Я не заметил столбец полевого поля, пока вы его пригвоздили :) +1 – e4c5

+0

Это отлично работает для числовых значений. Можете ли вы также предоставить решение для значений букв? – Nebu

1

Не то, что я знаю ...

Пожалуйста, обратите внимание, что каждая строка имеет FieldOrder так, что вы стремитесь достичь, кажется сомнительным. Что, если одна строка говорит asc, а другая строка говорит desc? Как должен выглядеть порядок двух строк?

Если вы хотите иметь параметризированный order by действие, вы можете рассмотреть вопрос об использовании следующих двух методов:

  1. Используйте хранимую процедуру, которая принимает аргумент, скажем, sortingOrder
  2. Используйте язык программирования (например Java) для построения строки запроса и динамически вводить порядок сортировки и затем выполнить строку запроса в MySQL
0

Вам необходимо нормализовать свои данные и сохранить их в лучшей схеме. Не храните несколько значений в одном поле, сохраняйте только одно значение для каждой строки. Что вы можете сделать, так это хранить несколько данных в своей таблице, где каждая часть данных находится в отдельной строке.

Попробуйте схему так:

CREATE TABLE `example` (
    `Identifier` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`Identifier`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `exampleData` (
    `RowID` int(11) NOT NULL AUTO_INCREMENT, 
    `Identifier` int(11) NOT NULL, 
    `FieldValue` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`RowID`), 
    INDEX `Identifier` (`Identifier`), 
    FOREIGN KEY (Identifier) REFERENCES example(Identifier) 
    ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Теперь у вас есть две таблицы, и в вашем exampleData столе, у вас есть один строку на каждую часть данных в FieldValue.

Теперь вы можете запросить так:

SELECT Identifier, FieldValue 
FROM example 
JOIN exampleData USING(Identifier) 
WHERE Identifier = 3 
ORDER BY FieldValue ASC 
Смежные вопросы