2013-11-27 4 views
1

У меня есть таблица MySQL, который выглядит следующим образом:Mysql выбрать из таблицы сдвигая один столбец

----- 
| 1 | 
----- 
| 3 | 
----- 
| 7 | 
----- 
| . | 
----- 
| . | 
----- 
| . | 
----- 
| n | 
----- 

является возможностью выбрать из этой таблицы, чтобы иметь что-то вроде этого:

---------- 
| 1 || 3 | 
---------- 
| 3 || 7 | 
---------- 
| 7 || . | 
---------- 
| . || . | 
---------- 
| . || . | 
---------- 
| n || n-1 | 
+0

Вы действительно хотите ** ** получить данные, как это, или просто показать его, как это? Какое преимущество извлекает данные в виде двух сращиваемых столбцов, кроме замедления запроса? – BenM

+0

yes Я хочу получить данные, подобные этому. – vovaminiof

+0

OK. Зачем нужно это делать? – BenM

ответ

1

Я думаю, ниже запроса ближайшее то, что вы хотите с MySQL

mysql> select * from num; 
+------+ 
| a | 
+------+ 
| 1 | 
| 3 | 
| 7 | 
| 11 | 
| 17 | 
+------+ 

mysql> select @prev:=a FROM num ORDER BY a ASC LIMIT 1,1; 
+----------+ 
| @prev:=a | 
+----------+ 
|  3 | 
+----------+ 
1 row in set (0.00 sec) 

mysql> select @prev, t1.a, @prev:=t1.a from num t1; 
+-------+------+-------------+ 
| @prev | a | @prev:=t1.a | 
+-------+------+-------------+ 
|  3 | 1 |   1 | <= 1st row is dummy 
|  1 | 3 |   3 | 
|  3 | 7 |   7 | 
|  7 | 11 |   11 | 
| 11 | 17 |   17 | 
+-------+------+-------------+ 
5 rows in set (0.00 sec) 

mysql> select MAX(a), NULL FROM num; 
+--------+------+ 
| MAX(a) | NULL | 
+--------+------+ 
|  17 | NULL | <= last row founded here 
+--------+------+ 
1 row in set (0.00 sec) 
0

реляционных данных не имеет понятия чисел строк или упорядочения строк, поэтому «смещение на 1 строку» невозможно с использованием (стандартного) SQL. Если таблица содержит поле «RowNumber» вы можете использовать автообъединение:

SELECT t1.field, t2.field 
    FROM mytable t1 join mytable t2 on(t1.rownumber = t2.rownumber+1) 

Но, как указано BenM: просто сдвигая на один ряд не делает слишком Мош смысл, но если у вас есть какие-либо другие сшиваемых критерий самообучения является полезным инструментом.

+0

Эта таблица не содержит идентификаторов – vovaminiof

0

Ответ уже отмечен. Но я размещаю его здесь для другого пользователя.

DECLARE @mytable table 
(
    mycolumn varchar(10) 
) 

INSERT INTO @mytable 
SELECT '| 1 |' UNION ALL 
----- 
SELECT '| 3 |' UNION ALL 
----- 
SELECT '| 7 |' UNION ALL 
----- 
SELECT '| . |' UNION ALL 
----- 
SELECT '| . |' UNION ALL 
----- 
SELECT '| . |' UNION ALL 
----- 
SELECT '| n |' 

SELECT * FROM @mytable 

SELECT 
    t1.mycolumn, t2.mycolumn 
FROM 
(
    SELECT 
     ROW_NUMBER() OVER (ORDER BY mycolumn) as rownum, mycolumn 
    from @mytable 
) t1 
INNER JOIN 
(
    SELECT 
     ROW_NUMBER() OVER (ORDER BY mycolumn)as rownum, mycolumn 
    from @mytable 
) t2 
on(t1.rownum = t2.rownum+1) 
WHERE t2.rownum > 0 

Этот запрос предназначен для сервера sql.

Посмотрите на следующую часть, которая в основном имеют логику

SELECT 
    t1.mycolumn, t2.mycolumn 
FROM 
(
    SELECT 
     ROW_NUMBER() OVER (ORDER BY mycolumn) as rownum, mycolumn 
    from @mytable 
) t1 
INNER JOIN 
(
    SELECT 
     ROW_NUMBER() OVER (ORDER BY mycolumn)as rownum, mycolumn 
    from @mytable 
) t2 
on(t1.rownum = t2.rownum+1) 
WHERE t2.rownum > 0 
Смежные вопросы