Ver Mensaje Individual
  #8 (permalink)  
Antiguo 20/03/2012, 08:33
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema ordenando por dos campos.

Bueno, el caso del LIMIT te está funcionando sólo porque usas una versión 5.5.6 o superior, ya que antes de eso LIMIT no admitía el uso de variables locales para ingresar los parámetros.
Cita:
Manual de referencia:
Within stored programs, LIMIT parameters can be specified using integer-valued routine parameters or local variables as of MySQL 5.5.6.
El tema de los ordenamientos personalizados y personalizables es bastante extenso, y se pueden resolver tanto dentro de las consultas, como en la base de datos. Hacerlo en uno u otro, depende de la decisión de diseño, principalmente, pero hay algunas cosas a considerar.
- En la aplicación es conveniente cuando la haces sobre la misma cantidad de registros devueltos incialmente, y normalmente se hace operando sobre la vista que presenta en pantalla, o los headers de las tablas.
- En la base, es coveniente cuando es un nuevo bloque de datos, pero no tiene ningún sentido hacer que repetidamente se realicen consultas sólo para obtener los mismos datos ordenados de diferentes formas.
- Un listado de orden fijo sólo sirve si se trata de reportes de estructura fija, pero no sirven para el uso general.
- Jamás puedes anticipar cómo va a querer el orden un usuario cualquiera. No puedes, porque con sólo que haya dos usuarios en dos momentos distintos, puedes tener dos o más formas de ordenar las cosas, según sea la necesidad de cada uno. Diferentes necesidades de resumenes de la misma información pueden producir ordenamientos distintos.
- Cuando ordenas en base a una o más columnas, y la seleccion del orden la hace al inicio el usuario, lo que haces es crear dinámicamente la consulta para que salga ordenada según quiere.
- Si el ordenamiento que se desea incluye ordenar juntos items que tienen una característica común (en la ropa, podrían ser Zapato, Pantalón, Pollera, etc), estas características no deben formar parte de la denominación, sino ser un atributo de la entidad representada, de modo de poder ser usado directamente como parámetro del ORDER BY.
- Puede también darse la situación de que este atributo pueda tener suficiente entidad como para ser independiente, y en ese caso estamos ante una relación entre dos entidades, donde ese atributo pasa a ser una foreign key. Esto facilita el proceso de crear el ORDER BY correcto. Tal es el caso de los conceptos de "categoría", "rubro", "clase", que puede ser tanto de objetos, como atributos de personas. En este orden, es posible que en tu modelo falten entidades (tabla), y le esté haciendo falta normalización.
- Es muy importante que comprendas, que normalmente lo que se hace en estos casos de ordenamiento personalizable, es crear la sentencia de consulta dinámicamente, y no en un SP que sólo te puede dar un orden fijo. Hay muchos ejemplos de cómo hacer eso en los foros de los diferentes lenguajes. Busca allí (este es MySQL, no se pone programación acá).

Finalmente, para que entiendas por qué es redundante la relación: Es por la transitividad de la relación:
Cita:
Si A está relacionado con B, y B está relacionado con C, entonces A está relacionado con C por medio de B.
¿Se entiende el concepto?
Entonces, si la relación es:
Cita:
Articulo -> Marca
Familia -> Familia_tiene_Marca
Marca -> Familia_tiene_Marca
entonces:
Cita:
Articulo -> Familia -> Familia_tiene_Marca -> Marca.
Lo que en SQL es:
Código MySQL:
Ver original
  1.     A.idArticulos,
  2.     A.Nombre,
  3.     A.Descripcion,
  4.     A.Precio
  5.     articulos A
  6.     INNER JOIN familias F ON A.Familias_idFamilias = F.idFamilias
  7.     INNER JOIN familias_has_marcas FTM ON F.idFamilias = FTM.Familias_idFamilias
  8.     INNER JOIN marcas M ON FTM.Marcas_idMarcas = M.idMarcas
  9. ORDER BY A.Nombre, A.Descripcion
Obviamente, esto implica que sólo podrá devolver aquellos registros que cumplan todas las condiciones.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)