Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Ordenar menu

Estas en el tema de Ordenar menu en el foro de Mysql en Foros del Web. Hola amigos tengo una consulta en mysql en el que debo de ordenar un menu, he creado un pequeño scritp en javascript y jquery en ...
  #1 (permalink)  
Antiguo 22/06/2017, 22:10
 
Fecha de Ingreso: octubre-2011
Mensajes: 132
Antigüedad: 12 años, 6 meses
Puntos: 4
Ordenar menu

Hola amigos tengo una consulta en mysql en el que debo de ordenar un menu, he creado un pequeño scritp en javascript y jquery en el que moviendo con el mouse se ordena el menu y se guarda en la BD, este menu tiene submenus y se relaciona por un campo llamado paren_id,

Digamos el id=1, con parent_id =0 es de primer nivel, el id=2 con parent id = 1 es submenu de id = 1,

id - prent_id - name - item_order
1 - 0 - titulo01 - 1
2 - 0 - titulo02 - 3
3 - 1 - subtitulo01 - 4
4 - 0 - titulo03 - 2
5 - 2 - subtitulo02 - 5

Lo que deseo es que cuando haga la consulta me muestre en el orden:

1 - 0 - titulo01 - 1
3 - 1 - subtitulo01 - 4
4 - 0 - titulo03 - 2
2 - 0 - titulo02 - 3
5 - 2 - subtitulo02 - 5

osea que el primer ordenamiento sea segun el item_order pero con sus respectivos subtitulso debajo.
  #2 (permalink)  
Antiguo 23/06/2017, 07:54
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Ordenar menu

Hola stevens82:

Tienes varias formas de resolver tu consulta, la más simple sería utilizar ordenamientos condicionales, es decir CASE-WHEN.

En primer lugar lo que tienes que hacer es AGRUPAR cada título con sus subtitulos... esto podrías hacerlo más o menos así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM menu;
  2. +------+----------+-------------+------------+
  3. | id   | prent_id | name        | item_order |
  4. +------+----------+-------------+------------+
  5. |    1 |        0 | titulo01    |          1 |
  6. |    2 |        0 | titulo02    |          3 |
  7. |    3 |        1 | subtitulo01 |          4 |
  8. |    4 |        0 | titulo03    |          2 |
  9. |    5 |        2 | subtitulo02 |          5 |
  10. +------+----------+-------------+------------+
  11. 5 rows in set (0.06 sec)
  12.  
  13. mysql> SELECT
  14.     ->   CASE WHEN M1.prent_id = 0
  15.     ->     THEN M1.item_order
  16.     ->     ELSE ( SELECT M2.item_order
  17.     ->            FROM menu M2
  18.     ->            WHERE M2.id = M1.prent_id) END grupo,
  19.     ->     M1.*
  20.     -> FROM menu M1;
  21. +-------+------+----------+-------------+------------+
  22. | grupo | id   | prent_id | name        | item_order |
  23. +-------+------+----------+-------------+------------+
  24. |     1 |    1 |        0 | titulo01    |          1 |
  25. |     3 |    2 |        0 | titulo02    |          3 |
  26. |     1 |    3 |        1 | subtitulo01 |          4 |
  27. |     2 |    4 |        0 | titulo03    |          2 |
  28. |     3 |    5 |        2 | subtitulo02 |          5 |
  29. +-------+------+----------+-------------+------------+
  30. 5 rows in set (0.01 sec)

Esto te dice entonces que el id=1 y el id=3 forman parte de un solo grupo, así como el id=2 y el id=5 forman parte de otro grupo... en el caso del id=4 está solo...

entonces lo único que haces es poner esta condición en el ORDER BY:

Código MySQL:
Ver original
  1. mysql> SELECT M1.*
  2.     -> FROM menu M1
  3.     -> ORDER BY
  4.     -> CASE WHEN M1.prent_id = 0
  5.     ->   THEN M1.item_order
  6.     ->   ELSE ( SELECT M2.item_order
  7.     ->          FROM menu M2
  8.     ->          WHERE M2.id = M1.prent_id) END,
  9.     -> item_order;
  10. +------+----------+-------------+------------+
  11. | id   | prent_id | name        | item_order |
  12. +------+----------+-------------+------------+
  13. |    1 |        0 | titulo01    |          1 |
  14. |    3 |        1 | subtitulo01 |          4 |
  15. |    4 |        0 | titulo03    |          2 |
  16. |    2 |        0 | titulo02    |          3 |
  17. |    5 |        2 | subtitulo02 |          5 |
  18. +------+----------+-------------+------------+
  19. 5 rows in set (0.00 sec)

Haz la prueba y nos comentas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 23/06/2017, 10:19
 
Fecha de Ingreso: octubre-2011
Mensajes: 132
Antigüedad: 12 años, 6 meses
Puntos: 4
Respuesta: Ordenar menu

Muchas Gracias Leonardo_Josue, por tu respuesta y tu ayuda de verdad me sirvio de sobre manera

Lo que tenía antes era esto:

Código MySQL:
Ver original
  1. SELECT P.id, PL.name_menu, PL.titulo, P.parent_id
  2.                 FROM pagina P
  3.                 INNER JOIN pagina_lang PL ON PL.id_pagina = P.id
  4.                 INNER JOIN langs L ON L.id = PL.id_lang
  5.                 WHERE P.estado_menu = 1 AND L.codigo = 'es'
  6.                 ORDER BY CASE WHEN P.parent_id = 0 THEN P.id ELSE P.parent_id END, P.parent_id

Y gracias a tu respuesta pude acoplarlo y el resultado es el que necesitaba

Código MySQL:
Ver original
  1. SELECT P.id, PL.name_menu, PL.titulo, P.parent_id
  2.             FROM pagina P
  3.             INNER JOIN pagina_lang PL ON PL.id_pagina = P.id
  4.             INNER JOIN langs L ON L.id = PL.id_lang
  5.             WHERE P.estado_menu = 1 AND L.codigo = 'es'
  6.             ORDER BY CASE WHEN P.parent_id = 0 THEN P.item_order ELSE (SELECT P2.item_order FROM pagina P2 WHERE P2.id = P.parent_id) END, item_order

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:28.