2015-06-07 3 views
-3

Итак, у меня есть одна запись; и это примерно так:MySQL - Как сортировать в записи?

data1 data2 data3 data4 
4  3  1  2 

Теперь я хочу отсортировать данные в 1 2 3 4 порядке. Итак: data3, data4, data2, data1 для строки 1

Кто-нибудь знает, как сортировать в записи таким образом?

+0

Вы не можете этого сделать, однако вы можете преобразовать таблицу, используя метод univot http://stackoverflow.com/questions/15184381/mysql-turn-table-into-different-table, а затем отсортировать результаты , – fsacer

+2

Я чувствую очень высокую вероятность того, что вы не используете структуры реляционных таблиц ... – David

+0

Рекомендации: 1) не делайте этого в SQL; сделайте это на клиенте. 2) пересмотреть дизайн таблицы ... возможно, значения, хранящиеся в отдельных столбцах одной и той же строки, будут лучше сохраняться в виде строк в отдельной таблице. – spencer7593

ответ

0

Как только у вас есть данные столбцов1, data2 и т. Д., Вам нужно изменить модель базы данных. В большинстве случаев это означает, что вам нужна новая дополнительная таблица.

неправильно:

users: 
- user_id 
- name 
- address1 
- address2 
- address3 

право:

users: 
- user_id 
- name 

addresses: 
- address_id 
- user_id 
- address 
0

Вы можете запустить следующий код. SELECT * FROM table_name ORDER BY coloumn_name ASC;

Вы также можете игнорировать ASC, поскольку это означает размещение в порядке возрастания.

+0

Нет, я не хочу сортировать по вертикали, я хочу сортировать по горизонтали – QuestionMaker

+0

Хорошо. Затем вы можете отослать ответ на свой вопрос о Гордоне Линоффе. –

0

Вот два метода. Вот UNPIVOT и repivot метод:

select substring_index(group_concat(col order by col), ',', 1) as data1, 
     substring_index(substring_index(group_concat(col order by col), ',', 2), ',', -1) as data2, 
     substring_index(substring_index(group_concat(col order by col), ',', 3), ',', -1) as data3, 
     substring_index(substring_index(group_concat(col order by col), ',', 4), ',', -1) as data4  
from ((select data1 as col from table) union all 
     (select data2 as col from table) union all 
     (select data3 as col from table) union all 
     (select data4 as col from table) 
    ) t 
group by col1, col2, col3, col4; # A real id would be better for this 
0

Одним из вариантов является создание простой функции:

DELIMITER $$ 

CREATE FUNCTION get_nth(vn INT, v1 INT, v2 INT, v3 INT, v4 INT) 
RETURNS INT 
BEGIN 
    DECLARE v_offset INT; 
    DECLARE v_return INT; 
    SET v_offset = vn-1; 
    SELECT o.val INTO v_return 
     FROM (SELECT v1 AS val 
       UNION ALL SELECT v2 
       UNION ALL SELECT v3 
       UNION ALL SELECT v4 
       ORDER BY 1 
       LIMIT v_offset,1 
      ) o; 
    RETURN v_return; 
END$$ 

DELIMITER ; 

С этой функции создан, вы можете сделать что-то вроде этого:

SELECT get_nth(1,t.data1,t.data2,t.data3,t.data4) AS od1 
    , get_nth(2,t.data1,t.data2,t.data3,t.data4) AS od2 
    , get_nth(3,t.data1,t.data2,t.data3,t.data4) AS od3 
    , get_nth(4,t.data1,t.data2,t.data3,t.data4) AS od4 
    FROM ( 
     SELECT 4 AS data1 
       , 3 AS data2 
       , 1 AS data3 
       , 2 AS data4 
     ) t 

(Просто замените встроенный вид t со ссылкой на таблицу, которая содержит столбцы data1..data4)

SQL Fiddle demonstration: http://sqlfiddle.com/#!9/e0e39/2

Смежные вопросы