Одним из вариантов является создание простой функции:
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
Вы не можете этого сделать, однако вы можете преобразовать таблицу, используя метод univot http://stackoverflow.com/questions/15184381/mysql-turn-table-into-different-table, а затем отсортировать результаты , – fsacer
Я чувствую очень высокую вероятность того, что вы не используете структуры реляционных таблиц ... – David
Рекомендации: 1) не делайте этого в SQL; сделайте это на клиенте. 2) пересмотреть дизайн таблицы ... возможно, значения, хранящиеся в отдельных столбцах одной и той же строки, будут лучше сохраняться в виде строк в отдельной таблице. – spencer7593