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

Alguno me diria cual es mi problema

Estas en el tema de Alguno me diria cual es mi problema en el foro de Mysql en Foros del Web. Lo que pasa es que yo estaba trabajando con wamp server 2/0 y con netbeans 6.5 y estoy usando el conector 5.1.7 para unirlos, pero ...
  #1 (permalink)  
Antiguo 26/05/2009, 10:39
Avatar de Panshop  
Fecha de Ingreso: abril-2009
Ubicación: Santiago
Mensajes: 87
Antigüedad: 15 años
Puntos: 0
Información Alguno me diria cual es mi problema

Lo que pasa es que yo estaba trabajando con wamp server 2/0 y con netbeans 6.5 y estoy usando el conector 5.1.7 para unirlos, pero resulta que mi profesor esta exigiendo que hagamos todo con easyphp 1.8 porque el wamp no se le instalaba bien y le tiraba error al arrancarlo, pero mi consulta en mysql me estaba corriendo bien hsta que lo cambie a easyphp1.8. Entonces...

Preguntare aqui ya que mi profe dijo que esta consulta no me la aguantaba por tener muchos alias... pero como no le creo escribo mi consulta aqui y pongo abajito el error... la consulta es la siguiente:

SELECT v.Cod_Vend AS Codigo3, SUM(f.Monto_Fact) AS Monto3
FROM Vendedores AS v,Facturas AS f, VendFact AS vf
WHERE f.Num_Fact = vf.Num_Fact
AND v.Cod_Vend = vf.Cod_Vend
AND vf.Cod_Vend LIKE 'LEP'

el error es el siguiente:

#1140 - Mezcla de columnas GROUP (MIN(),MAX(),COUNT()...) con no GROUP columnas es ilegal si no hat la clausula GROUP BY


Alguno sabria explicarme porque me lanza ese error??
Atte
Panxo
  #2 (permalink)  
Antiguo 26/05/2009, 10:44
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Alguno me diria cual es mi problema

Cita:
Preguntare aqui ya que mi profe dijo que esta consulta no me la aguantaba por tener muchos alias...
Tienes razón... tu profesor está equivocado. La cantidad de alias no tiene nada que ver.

Tu error, se debe a utilizar la función sum dentro de los parametros de entrada de la consulta y requiere diferenciar que monto_fact debe sumar, ya que encuentra varios códigos con salidas diferentes.

prueba esto:

Código mysql:
Ver original
  1. SELECT v.Cod_Vend AS Codigo3, SUM(f.Monto_Fact) AS Monto3
  2. FROM Vendedores AS v,Facturas AS f, VendFact AS vf
  3. WHERE f.Num_Fact = vf.Num_Fact
  4. AND v.Cod_Vend = vf.Cod_Vend
  5. AND vf.Cod_Vend LIKE 'LEP' group by v.Cod_Vend;

Te recomiendo hacer uso de sentencias join, que aunque generan el mismo resultado, son mejores en rendimiento.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 26/05/2009, 10:56
Avatar de Panshop  
Fecha de Ingreso: abril-2009
Ubicación: Santiago
Mensajes: 87
Antigüedad: 15 años
Puntos: 0
Respuesta: Alguno me diria cual es mi problema

thx pero ahi algo que no me kedo claro U.u
porque en el motor del wampserver me funciono sin eso del group by?
y en el easyphp me está exigiendo eso... eso no me quedo claro U.u

en fin, GRACIAS por la ayuda ^^ me alegro el dia
  #4 (permalink)  
Antiguo 26/05/2009, 10:59
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Alguno me diria cual es mi problema

Seguro en easyphp tienes la misma consulta y te funciona?

si la tienes así:
Código mysql:
Ver original
  1. SELECT SUM(f.Monto_Fact) AS Monto3
  2. FROM Vendedores AS v,Facturas AS f, VendFact AS vf
  3. WHERE f.Num_Fact = vf.Num_Fact
  4. AND v.Cod_Vend = vf.Cod_Vend
  5. AND vf.Cod_Vend LIKE 'LEP' GROUP BY v.Cod_Vend;

Sin el v.Cod_Vend en la consulta no es requerido el group by.

Que versión de mysql trabaja el easyphp?

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 27/05/2009, 18:03
Avatar de Panshop  
Fecha de Ingreso: abril-2009
Ubicación: Santiago
Mensajes: 87
Antigüedad: 15 años
Puntos: 0
Respuesta: Alguno me diria cual es mi problema

en el easyphp 1.8 necesito el group by v.cod_vend
pero en el wampserver 2.0 no lo necesito esa es la cosa que yo tampoco se D:

es decir, la consulta que sale al principio en el primer posteo de este tema, la tenia en el wampserver 2.0 y me mostraba el resultado... pero al pasarme al easyphp por obligacion del profesor (cosa que no deberia estar permitida) me pedia que pusiera al final la parte GROUP BY v.Cod_Vend
  #6 (permalink)  
Antiguo 27/05/2009, 20:49
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: Alguno me diria cual es mi problema

El tema no pasa por el EasyPhp o el WampServer (que usa PhpMyAdmin), sino por la versión del MySQL que tengas instalado y la forma de parsear la consulta.
En cualquier caso, es extraño que el EasyPhp te hubiese dado resultados, a menos que el mismo EasyPhp modificara la consulta al momento de enviarla al MySQL. Es raro, porque de entrada estaba mal escrita.

Veamos los dos detalles:

1. Lo que dice el profesor de los alias es simplemente una tontería. Puedes poner un alias a cada columna en una consulta de 36 columnas o más, y de todos modos funcionará, porque los alias no intervienen en el problema. Son nada más que suplantadores de nombre de columna (La única singularidad del caso es que el WHERE no los reconoce como nombres de columna, y tampoco se puede hacer lo mismo con el HAVING o usarlos para el GROUP BY si están en una función agregada, a menos que sean de una subconsulta).
2. El mensaje de error te lo dice todo: No se puede usar una función agregada (SUM(), AVG(), MAX(), MIN(), etc.) en una consulta donde una columna no tenga función agregada definida sin usar GROUP BY sobre esa columna.
Esto es porque las funciones de agregación generan un sólo resultado en una línea, siempre, mientras que esa columna genera más de uno. MySQL no sabe a qué linea van a corresponder los resultados obtenidos, o si se está pidiendo subtotales. Por eso requiere de la cláusula GROUP BY, para saber sobre qué criterio se realizarán los subtotales.
En tu caso, estás buscando la suma de facturas emitidas por los vendedores cuyo codigo sea igual a "LEP" (atención: no es que contenga, has escrito que sea igual a "LEP", porque no contiene los "%" para que busque los parecidos o que contengan eso).
Eso sería:
Código sql:
Ver original
  1. SELECT
  2.     v.Cod_Vend Codigo3,
  3.     SUM(f.Monto_Fact) Monto3
  4. FROM Vendedores AS v INNER JOIN Facturas f USING(Num_Fact) INNER JOIN VendFact vf USING(Cod_Vend)
  5. WHERE vf.Cod_Vend LIKE 'LEP';

Detalles:
1. No es buena idea usar "," (equivalente a JOIN) en la vinculación de tablas, a menos que estés seguro que los campos del mismo nombre en las diferentes tablas contengan el mismo tipo de dato. Si no es así, MySQL intentará hacer que se relacionen dos campos del mismo nombre entre dos tablas que contendrán datos de diferente tipo... dando lugar a errores.
2. Es de buen DBA usar INNER JOIN, LEFT JOIN o RIGHT JOIN, ya que son cláusulas que le permiten al MySQL hacer optimizaciones en el parseo.
3. Los "AS" en los alias son opcionales. No son obligatorios. Se quitó la obligación hace años y se conserva por compatibilidad con las versiones viejas.
4. Las relaciones entre los campos de dos tablas no se ponen en el WHERE sino en el FROM, sea usando "ON v.Num_Fact = f.Num_Fact" como USING(Num_Fact). Eso es fundamentalmente porque el parser de MySQL no puede optimizar lo que hay en el WHERE, pero si puede con lo que hay en el FROM.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 28/05/2009, 07:46
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Alguno me diria cual es mi problema

Cita:
porque los alias no intervienen en el problema. Son nada más que suplantadores de nombre de columna (La única singularidad del caso es que el WHERE no los reconoce como nombres de columna, y tampoco se puede hacer lo mismo con el HAVING o usarlos para el GROUP BY si están en una función agregada, a menos que sean de una subconsulta).
Una pequeña aclaración:
Si se hace uso de having, si es posible usar los alias para las respectivas comparaciones. Una consulta de tipo:

Código mysql:
Ver original
  1. select campo1 c1, campo2 c2 from tabla group by c1 having c1 = valor;

Si funciona. Lo que no se muy bien, es en rendimiento que tanto se diferencia el having del where.

Un saludo
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
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 06:32.