Tema: Ordenar menu
Ver Mensaje Individual
  #2 (permalink)  
Antiguo 23/06/2017, 07:54
leonardo_josue
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.