MySQL - consulta sobre base de datos para altererar orden de una columna

 
Vista:
sin imagen de perfil

consulta sobre base de datos para altererar orden de una columna

Publicado por luis (5 intervenciones) el 19/03/2018 17:46:34
cunsulta MYSQL
buenas tengo un incoveniente
tengo una tabla con una columna de nombre estado

estado
1
20
14
5
9
7
3


como puedo mostrar este resultado
tomando en cuenta q la columna estado_anterior es la misma solo que debemostrar el numero (estado) anterior

estado - estado_anterior
1 null
20 1
14 20
5 14
9 5
7 9
3 7
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

consulta sobre base de datos para altererar orden de una columna

Publicado por Leonardo Josué (414 intervenciones) el 20/03/2018 15:47:26
Hola Luis:

Para hacer lo que quieres, debes de contar con algún otro campo para ordenar tus datos ya que tal como los tienes no hay una forma de determinar que 20 va antes que 14 o que 5 va antes que el nueve... puede ser un campo tipo fecha o un consecutivo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
mysql> SELECT * FROM tabla;
+-------------+--------+
| consecutivo | estado |
+-------------+--------+
|           1 |      1 |
|           2 |     20 |
|           3 |     14 |
|           4 |      5 |
|           5 |      9 |
|           6 |      7 |
|           7 |      3 |
+-------------+--------+
7 rows in set (0.00 sec)
 
mysql> SELECT T1.estado, ( SELECT estado
    ->                     FROM tabla T2
    ->                     WHERE T2.consecutivo < T1.consecutivo
    ->                     ORDER BY consecutivo DESC
    ->                     LIMIT 1) estado_anterior
    -> FROM tabla T1;
+--------+-----------------+
| estado | estado_anterior |
+--------+-----------------+
|      1 |            NULL |
|     20 |               1 |
|     14 |              20 |
|      5 |              14 |
|      9 |               5 |
|      7 |               9 |
|      3 |               7 |
+--------+-----------------+
7 rows in set (0.00 sec)

Si en tu tabla NO TIENES NINGÚN CAMPO QUE TE SIRVA PARA ORDENAR TUS DATOS, entonces tendrías que crear una columna virtual como una secuencia. puedes preguntarle a SAN GOOGLE cómo hacer esto.

Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

consulta sobre base de datos para altererar orden de una columna

Publicado por luis (5 intervenciones) el 20/03/2018 17:19:51
hola amigo tienes mucha razon en tu logica pero lo malo esq no tengo un consecutivo y el campo fecha tampoco son consecutivos son ocupadas segun como se ocupa
SELECT T1.status, ( SELECT status

FROM history T2

WHERE T2.id < T1.id

ORDER BY id DESC

LIMIT 1) estado_anterior

FROM history T1 where T1.item_id=3707

# status, estado_anterior
1 23
1
17
6 17
18 6
20
18
20 18
13 1
6 13
6
18
1

20 21
18 1
20 18
20
18



18 15
18


21 20
23 12
18
18 20
18 6
20 18
6 99
14 23

(los vacios son nulos) la consulta sale asi porq el id no es consecutivo

set @a=0;
SELECT @a := @a+1 as consecutivo, T1.status, ( SELECT status

FROM history T2

WHERE consecutivo < consecutivo

ORDER BY consecutivo DESC

LIMIT 1) estado_anterior

FROM history T1 where T1.item_id=3607
y con ese la verdad estoy mal porq el select interior no puede contener mas de una columna para poder asiganarle un consecutivo a la tabla 2
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 953
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

consulta sobre base de datos para altererar orden de una columna

Publicado por Leonardo Josué (414 intervenciones) el 20/03/2018 20:21:47
Hola de nuevo Luis:

No me quedó claro como tienes tu información ya que no le das formato a tus datos y parece que todos los números estás encimados. Te sugiero que utilices las herramientas del editor de texto para que quede más claro, cuando quieras poner datos o código utiliza la etiqueta </> que hay en el menú para diferenciarlo del resto del texto.

ahora bien, volviendo a tu problema, no estás tan equivocado en la segunda consulta, pero hay un pequeño detalle al hacerlo como subconsulta, sin embargo, hay muchas otras formas de hacerlo, veamos aquí cómo hacerlo con un LEFT JOIN:

partimos de que en tu tabla no hay consecutivos:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> SELECT estado FROM tabla;
+--------+
| estado |
+--------+
|      1 |
|     20 |
|     14 |
|      5 |
|      9 |
|      7 |
|      3 |
+--------+
7 rows in set (0.00 sec)

Como te dije, el primer paso es numerar tus registros con un consecutivo, esto lo puedes hacer así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SET @a:=0;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT
    ->   @a := @a+1 consecutivo,
    ->   estado
    -> FROM tabla;
+-------------+--------+
| consecutivo | estado |
+-------------+--------+
|           1 |      1 |
|           2 |     20 |
|           3 |     14 |
|           4 |      5 |
|           5 |      9 |
|           6 |      7 |
|           7 |      3 |
+-------------+--------+
7 rows in set (0.00 sec)

¿qué pasaría si tuvieras dos tablas con esta misma información? si hicieras un join con dos tablas entonces el id = 1 de tu tabla1 se "juntaria" con el id = 2 de tu tabla2, el 2 con el 3, el 4 con el 5 etc... en otras palabras de "juntaría con el ID + 1, es decir, algo así:

1
2
3
4
5
6
7
8
9
10
11
+-------------+--------+-------------+--------+
| consecutivo | estado | consecutivo | estado |
+-------------+--------+-------------+--------+
|           1 |      1 |        NULL |   NULL |
|           2 |     20 |           1 |      1 |
|           3 |     14 |           2 |     20 |
|           4 |      5 |           3 |     14 |
|           5 |      9 |           4 |      5 |
|           6 |      7 |           5 |      9 |
|           7 |      3 |           6 |      7 |
+-------------+--------+-------------+--------+

Entonces, lo único que tienes que hacer es SIMULAR que tienes dos tablas UTILIZANDO ALIAS para la consulta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
mysql> SET @a:=0;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SET @b:=0;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT T1.estado, T2.estado ultimo_estado
    -> FROM ( SELECT
    ->        @a := @a+1 consecutivo,
    ->        estado
    ->        FROM tabla ) T1
    -> LEFT JOIN
    ->      ( SELECT
    ->        @b := @b+1 consecutivo,
    ->        estado
    ->        FROM tabla ) T2 ON T1.consecutivo = T2.consecutivo + 1
    -> ORDER BY T1.consecutivo
    -> ;
+--------+---------------+
| estado | ultimo_estado |
+--------+---------------+
|      1 |          NULL |
|     20 |             1 |
|     14 |            20 |
|      5 |            14 |
|      9 |             5 |
|      7 |             9 |
|      3 |             7 |
+--------+---------------+
7 rows in set (0.00 sec)

¿Se entiende? Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

consulta sobre base de datos para altererar orden de una columna

Publicado por luis (5 intervenciones) el 21/03/2018 17:41:57
si amigo de esa es la manera muchas gracias me fuiste de muchisima ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar