Ver Mensaje Individual
  #3 (permalink)  
Antiguo 13/06/2011, 09:26
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Mensaje Respuesta: Mysql: Select ordenado por final de cadena

Hola Scorpiatus:

Cita:
En el ejemplo, debería devolverme:

ID: 2,3,1
No termino por identificar por qué dices que te debe regresar los registros en este orden. Creo que hay un error en los datos pero veamos si estoy en lo correcto. Según lo que entendí el #numero representa el orden en que deberían presentarse cada producto por categoría. En el ejemplo SI SÓLO TOMAMOS EN CUENTA LOS DATOS DE CATE_1 tendríamos los siguientes datos:

[HIGHLIGHT="SQL"]
Código SQL:
Ver original
  1. ID | Producto | Categorias
  2. ----+------------------+---------------------------------------
  3. 1 | producto 1 | cate_1#3
  4. 2 | producto 2 | cate_1#3
  5. 3 | producto 3 | cate_1#2

como vez NO EXISTE EN TUS REGISTROS NINGÚN REGISTRO CON CATE_1#1, por lo tanto el orden en que debería presentar los datos según yo sería 3, 1, 2 para este ejemplo. Esto podrías lograrlo más o menos así:

Código MySQL:
Ver original
  1. mysql> create table prueba (ID int, Producto varchar(15),
  2.     -> Categorias varchar(50));
  3. Query OK, 0 rows affected (0.14 sec)
  4.  
  5. mysql> insert into prueba values (1, 'producto 1', 'cate_1#3 cate_4#2'),
  6.     -> (2, 'producto 2', 'cate_2#1 cate_5#6 cate_1#3'),
  7.     -> (3, 'producto 3', 'cate_1#2');
  8. Query OK, 3 rows affected (0.02 sec)
  9. Records: 3  Duplicates: 0  Warnings: 0
  10.  
  11. mysql> select * from prueba;
  12. +------+------------+----------------------------+
  13. | ID   | Producto   | Categorias                 |
  14. +------+------------+----------------------------+
  15. |    1 | producto 1 | cate_1#3 cate_4#2          |
  16. |    2 | producto 2 | cate_2#1 cate_5#6 cate_1#3 |
  17. |    3 | producto 3 | cate_1#2                   |
  18. +------+------------+----------------------------+
  19. 3 rows in set (0.00 sec)
  20.  
  21. mysql> select p.*,
  22.     -> SUBSTRING_INDEX(substring(Categorias, INSTR(Categorias, 'cate_1'), length
  23. (Categorias)), ' ', 1) orden
  24.     -> from prueba p where Categorias LIKE '%cate_1#%'
  25.     -> order by substring(orden, -1);
  26. +------+------------+----------------------------+----------+
  27. | ID   | Producto   | Categorias                 | orden    |
  28. +------+------------+----------------------------+----------+
  29. |    3 | producto 3 | cate_1#2                   | cate_1#2 |
  30. |    1 | producto 1 | cate_1#3 cate_4#2          | cate_1#3 |
  31. |    2 | producto 2 | cate_2#1 cate_5#6 cate_1#3 | cate_1#3 |
  32. +------+------------+----------------------------+----------+
  33. 3 rows in set (0.00 sec)

Ahora bien, cuando dices

Cita:
pueden pertenecer a un número infinito de categorías.
El modelo deja de ser práctico, ya que tendrás un enorme desperdicio de recursos al tener que manejar una columna de tipo texto enorme. En lugar de esto creo que lo ideal hubiera sido que manejaras dos tablas de catálogo (productos y categorías) y una tabla Productos-Categorías de tal manera que tus datos fueran más o menos así:

Código:
PRODUCTOS:
IDProducto|Producto
---------------------------------
1|producto 1
2|producto 2
3|producto 3


CATEGORIAS:
IDCategoria|Descripcion
----------------------------------
1|Cate_1
2|Cate_2
3|Cate_3

PRODUCTOS_CATEGORIAS
idProdCat|idProducto|idCatetgoria|Orden
------------------------------------------------------
1|1|1|3
2|2|1|1
3|3|1|2
4|2|2|1
5|3|3|1
Si tienes oportunidad de cambiar tu modelo de datos te recomiendo que lo hagas, te evitarás muchos problemas en el futuro.

Saludos
Leo.