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

Con alias no funciona el ORDER BY

Estas en el tema de Con alias no funciona el ORDER BY en el foro de Bases de Datos General en Foros del Web. Hola a todos. En esta consulta no puedo filtrar los resultados por orden si uso un alias. SELECT facturas.id, (SELECT sum(pvp_facturas) FROM detalle_factura WHERE id_factura=factura.id) ...
  #1 (permalink)  
Antiguo 28/10/2010, 09:39
 
Fecha de Ingreso: marzo-2003
Ubicación: Barcelona
Mensajes: 107
Antigüedad: 21 años, 1 mes
Puntos: 0
Con alias no funciona el ORDER BY

Hola a todos.
En esta consulta no puedo filtrar los resultados por orden si uso un alias.

SELECT facturas.id, (SELECT sum(pvp_facturas) FROM detalle_factura WHERE id_factura=factura.id) AS pvp FROM facturas WHERE factura.id=25 ORDER BY pvp ASC

me dice (Unknown column 'pvp' in 'order clause')
haciendo ORDER BY id_factura ASC, si funciona.

Que hago mal.

Gracias.
  #2 (permalink)  
Antiguo 28/10/2010, 09:52
Avatar de 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: Con alias no funciona el ORDER BY

Yo la plantearía así:
Código MySQL:
Ver original
  1.     F.id,
  2.     SUM(D.pvp_facturas)  pvp
  3. FROM facturas F INNER JOIN  detalle_factura D ON F.id = D.id_factura
  4.     F.id=25
Normalmente, en MySQL esto debería funcionar, pero de todos modos sólo te podría devolver el resultado de una factura, que es lo que estás buscando con ese WHERE.
Si lo que quieres es que te liste todos los valores y luego te de la suma total, la sentencia debería ser diferente:
Código MySQL:
Ver original
  1.     F.id,
  2.     SUM(D.pvp_facturas)  pvp
  3. FROM facturas F INNER JOIN  detalle_factura D ON F.id = D.id_factura
  4.     F.id=25
  5. GROUP BY F.id, D.pvp_facturas WITH ROLLUP

Si no es ni una cosa ni la otra, tendrá que aclarar qué es lo que quieres obtener...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 28/10/2010, 10:45
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Con alias no funciona el ORDER BY

Buenos días:

Me parece correcto el planteamiento que te hace el compañero gnzsoloyo, pero si insiste en utilizar tu consulta, puedes probar utilizando la posición del campo por el que quieres ordenar y no su nombre o alias, es decir algo como esto:

Código SQL:
Ver original
  1. SELECT
  2. facturas.id,
  3. (SELECT
  4. SUM(pvp_facturas)
  5. FROM detalle_factura
  6. WHERE id_factura=factura.id) AS pvp
  7. FROM facturas WHERE factura.id=25 ORDER BY 2 ASC

El resultado debería ser el que esperas.

Saludos.
Leo.
  #4 (permalink)  
Antiguo 28/10/2010, 11:19
 
Fecha de Ingreso: marzo-2003
Ubicación: Barcelona
Mensajes: 107
Antigüedad: 21 años, 1 mes
Puntos: 0
Respuesta: Con alias no funciona el ORDER BY

Bueno... En realidad la consulta es algo mas compleja, y sigue sin funcionar el ORDER BY pvp porque no es una columna.

He provado vuestras formulas, pero sigo liado.

Dejo la consulta exacta.

$_consulta = sprintf("SELECT emp.value AS empresa, nom.value AS nombre, SUM(precio.pvp_factura_det) AS pvp, factura.id_fac, factura.print_fac, factura.num_fac, factura.fecha_creacion_fac, factura.estado_fac FROM conta_facturas AS factura LEFT JOIN conta_detalle_factura AS precio ON precio.id_factura_det=factura.id_fac LEFT JOIN profile_values AS emp ON emp.fid=%s && emp.uid=factura.uid_fac LEFT JOIN profile_values AS nom ON nom.fid=%s && nom.uid=factura.uid_fac WHERE factura.uid_fac>1 GROUP BY factura.id_fac ".$where." ORDER BY ".$orderBy, $fid,$fnom);

No acabo de sacarlo solo...

Gracias
  #5 (permalink)  
Antiguo 28/10/2010, 11:21
Avatar de 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: Con alias no funciona el ORDER BY

Pregunta base: ¿Qué DBMS usas?

Es importante saberlo porque casos como MySQL, por ejemplo, admite perfectamente el uso de los alias en el ORDER BY.
Mmmm..., con la excepción de las funciones agregadas... Por lo que elproblema anda por allí.
Para hacerlo correctamente, entonces, deberías transformar toda la salida en una subconsulta. De esa forma si puedes ordenarlo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 28/10/2010, 11:41
 
Fecha de Ingreso: marzo-2003
Ubicación: Barcelona
Mensajes: 107
Antigüedad: 21 años, 1 mes
Puntos: 0
Respuesta: Con alias no funciona el ORDER BY

Pues MYSQL...

Toda la salida en una subconsulta??
Ahora si que ya estoy perdido, perdido!!

La versión de MYSQL puede tener algo a ver, creo que tengo la 5.algo??
  #7 (permalink)  
Antiguo 28/10/2010, 12:02
 
Fecha de Ingreso: marzo-2003
Ubicación: Barcelona
Mensajes: 107
Antigüedad: 21 años, 1 mes
Puntos: 0
Respuesta: Con alias no funciona el ORDER BY

Bueno. he simplificado el código para entenderlo mejor, y sigue dando el mismo problema

SELECT SUM(precio.pvp_factura_det) AS pvp, factura.id_fac
FROM conta_facturas AS factura
LEFT JOIN conta_detalle_factura AS precio ON precio.id_factura_det=factura.id_fac
WHERE factura.uid_fac > 1
GROUP BY factura.id_fac
ORDER BY pvp DESC

Unknown column 'pvp' in 'order clause
ORDER BY pvp DESC
  #8 (permalink)  
Antiguo 28/10/2010, 12:08
Avatar de 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: Con alias no funciona el ORDER BY

Básicamente es lo que está haciendo leonardo_josue:
Código:
SELECT *
FROM 
    (SELECT 
        emp.value empresa, 
        nom.value nombre, 
        SUM(precio.pvp_factura_det) pvp, 
        factura.id_fac, 
        factura.print_fac, 
        factura.num_fac, 
        factura.fecha_creacion_fac, 
        factura.estado_fac 
    FROM 
        conta_facturas factura 
        LEFT JOIN  conta_detalle_factura precio 
            ON precio.id_factura_det = factura.id_fac 
        LEFT JOIN profile_values emp 
            ON emp.fid=%s && emp.uid = factura.uid_fac 
        LEFT JOIN profile_values nom 
            ON nom.fid=%s && nom.uid = factura.uid_fac 
    WHERE factura.uid_fac>1 
    GROUP BY factura.id_fac ".$where.") T1
ORDER BY ".$orderBy
Cuando analizo el jemplo que has puesto me encuentro con algunos detalles a observar:
1) No debes usar palabras reservadas en las denominaciones de campos, tablas, bases, etc., porque traen problemas en la ejecución de las consultas. Puntualmente, no puedes denominar a un campo VALUE porque eso es una palabra reservada del SQL.
2) El signo "%" tiene uso dentro de las cadenas, pero no se debe usar a la ligera en una consulta porque es un operador de modulo de división, y en el contexto del uso que le das puede producir errores de sintaxis.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 28/10/2010, 14:39
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Con alias no funciona el ORDER BY

¿También marca error cuando pones la posición en lugar del campo?

Código MySQL:
Ver original 

Leo
  #10 (permalink)  
Antiguo 28/10/2010, 15:30
 
Fecha de Ingreso: marzo-2003
Ubicación: Barcelona
Mensajes: 107
Antigüedad: 21 años, 1 mes
Puntos: 0
Respuesta: Con alias no funciona el ORDER BY

Pues no Leo, me da el mismo error. Ya no se que hacer.
Y tu código gnzsoloyo me genera error .

"server version for the right syntax to use near ') T1' at line 1"

Por otro lado. el campo "value" es de una tabla que interactuo de DRUPAL, y el "%" no llega a mysql, es de una función de PHP, sprintf("hola %s", $planeta);
Gracias por la ayuda, indagaré en las versiones de mysql, igual va de esto.
  #11 (permalink)  
Antiguo 28/10/2010, 15:39
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Con alias no funciona el ORDER BY

Si ejecutas tu consulta

Código:
SELECT SUM(precio.pvp_factura_det) AS pvp, factura.id_fac 
FROM conta_facturas AS factura
LEFT JOIN conta_detalle_factura AS precio ON precio.id_factura_det=factura.id_fac 
WHERE factura.uid_fac > 1 
GROUP BY factura.id_fac 
ORDER BY pvp DESC
en el MySQL Query Browser o utilizando el SQLyog también te marca el mismo error
o sólo desde tu página PHP?....

Sinceramente no veo nada raro en la consulta.

Leo
  #12 (permalink)  
Antiguo 28/10/2010, 15:52
 
Fecha de Ingreso: marzo-2003
Ubicación: Barcelona
Mensajes: 107
Antigüedad: 21 años, 1 mes
Puntos: 0
Respuesta: Con alias no funciona el ORDER BY

Estoy en ello, pero creo que acabo de descubrir el fallo!!!

pvp no se detecta ni que lo ponga en el WHERE . EJ. WHERE pvp>50... parece no estar declarado hasta el final de la consulta.

mira esto http://dev.mysql.com/doc/refman/5.0/...ith-alias.html

HAVING, que no se que es, puede ser la respuesta???
  #13 (permalink)  
Antiguo 28/10/2010, 16:14
Avatar de 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: Con alias no funciona el ORDER BY

1) ¿Qué versión de MySQL usas?
2) ¿Qué es lo que contiene la variable "$where"?
3) Ningún DBMS admite usar los ALIAS en el WHERE; este sólo admite los alias para las tablas y no para los campos.
4) HAVING se usa precisamente para obtener resultados que no pueden ser obtenidos en el WHERE por ciertas limitaciones, como por ejemplo, que el WHERE no admite el uso de funciones agregadas en él (SUM(), MAX(), MIN(), AVG(), etc.).
5) Para comprobar si la sentencia funciona bien, te sugiero que la ejecutes poniendo manualmente valores reales y te fijes si devuelve datos. Es decir: Usa un front-end como phpMyAmin y ejecuta manualmente la consulta. SI falla allí, al menos verás dónde, sino falla, el error está en el PHP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #14 (permalink)  
Antiguo 28/10/2010, 16:29
 
Fecha de Ingreso: marzo-2003
Ubicación: Barcelona
Mensajes: 107
Antigüedad: 21 años, 1 mes
Puntos: 0
Respuesta: Con alias no funciona el ORDER BY

Muy bien, pues tienes todad la razón con el alias en el WHERE, no se ni lo que hago.

En el front end , funciona perfectamente. Buena idea, no se como no se me ocurrio hace 5 horas...

Vamos con el php o no se que pasa.

Muchas gracias por tu ayuda
  #15 (permalink)  
Antiguo 28/10/2010, 16:33
 
Fecha de Ingreso: marzo-2003
Ubicación: Barcelona
Mensajes: 107
Antigüedad: 21 años, 1 mes
Puntos: 0
Respuesta: Con alias no funciona el ORDER BY

Anda ya...el error viene de un script de paginación (paginator) que creo que es de un moderador de aquí, el cual te inserta valores de LIMIT, etc. al final de la consulta. Al desactivarlo todo funciona bien.
  #16 (permalink)  
Antiguo 28/10/2010, 17:18
 
Fecha de Ingreso: marzo-2003
Ubicación: Barcelona
Mensajes: 107
Antigüedad: 21 años, 1 mes
Puntos: 0
Respuesta: Con alias no funciona el ORDER BY

Rectifico... el script viene preparado con opciones para que esto no te pase.

Etiquetas: alias, order
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 11:49.