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

Ordenar y mostrar el mayor de los votos

Estas en el tema de Ordenar y mostrar el mayor de los votos en el foro de Bases de Datos General en Foros del Web. tengo una duda tengo un sistema de votaciones para presidentes el problema es el siguiente si alguien supongase que hay 3 presidentes PEPE,JUAN y FULANITO ...
  #1 (permalink)  
Antiguo 22/07/2012, 14:00
 
Fecha de Ingreso: julio-2012
Ubicación: venezuela
Mensajes: 10
Antigüedad: 12 años, 4 meses
Puntos: 0
Ordenar y mostrar el mayor de los votos

tengo una duda tengo un sistema de votaciones para presidentes el problema es el siguiente si alguien supongase que hay 3 presidentes PEPE,JUAN y FULANITO si votasen el resultado seria el siguiente
PEPE= 3
JUAN=2
FULANITO= 5
tengo una consulta que me devuelve el que obtuvo mas votos es decir FULANITO lo selecciona como ganador pero a la hora de que alla un empate no encuentro como solucionar trabajo en php algo asi esta mi consulta
Código PHP:
$rmaxmysql_query("select nombre,apellido,voto,max(round(voto/t1.total*100)) ganador from presidentes,(select sum(voto) total from presidentes) t1 group by nombre order by voto desc limit 1;");
                        while(
$max mysql_fetch_array($rmax)){
                            echo 
'<br><br><p id="pganador">El Ganador con '.$max["ganador"].'% de los votos es '.$max["nombre"].' '.$max["apellido"].'</p>'
que le faltaria para que mostrara si es un empate se los agradeceria
  #2 (permalink)  
Antiguo 22/07/2012, 18:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Ordenar y mostrar el mayor de los votos

Código MySQL:
Ver original
  1.     nombre,
  2.     apellido,
  3.     voto,
  4.     ROUND(voto/t1.total*100) ganador
  5. FROM presidentes,
  6.     (SELECT SUM(voto) total FROM presidentes) t1
  7. GROUP BY nombre
  8. HAVING round(voto/t1.total*100) = max(round(voto/t1.total*100))
__________________
¿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 22/07/2012, 19:59
 
Fecha de Ingreso: julio-2012
Ubicación: venezuela
Mensajes: 10
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Ordenar y mostrar el mayor de los votos

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Código MySQL:
Ver original
  1.     nombre,
  2.     apellido,
  3.     voto,
  4.     ROUND(voto/t1.total*100) ganador
  5. FROM presidentes,
  6.     (SELECT SUM(voto) total FROM presidentes) t1
  7. GROUP BY nombre
  8. HAVING round(voto/t1.total*100) = max(round(voto/t1.total*100))
gracias por la respuesta me esta dando un problema en el having con la sentencia t1.total que dice que no la conoce sera cuestion de orden? porque esta antes? del having
lei tambien que era por cuestion de ambiguedad estoy cambiando algunas cosas a ver si me resulta

Última edición por fenix2414; 22/07/2012 a las 20:07
  #4 (permalink)  
Antiguo 22/07/2012, 20:24
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Ordenar y mostrar el mayor de los votos

Cita:
gracias por la respuesta me esta dando un problema en el having con la sentencia t1.total que dice que no la conoce sera cuestion de orden? porque esta antes? del having
- El orden es el correcto, el HAVING debe siempre ir antes del ORDER BY porque debe evaluar el resultado, y si el resultado, no puedes ordenar nada.
- Existe ambigüedad cuando al invocar dos tablas, haces mención de un campo que puede existir en más de una con el mismo nombre. No parecería ser el caso, por lo que necesitarías que seas más preciso: Copia exactamente lo que MySQL te devuelve como mensaje. Transcipciones parciales no sirven para saber cuál es el error.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 22/07/2012, 20:30
 
Fecha de Ingreso: julio-2012
Ubicación: venezuela
Mensajes: 10
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Ordenar y mostrar el mayor de los votos

Cita:
Iniciado por gnzsoloyo Ver Mensaje
- El orden es el correcto, el HAVING debe siempre ir antes del ORDER BY porque debe evaluar el resultado, y si el resultado, no puedes ordenar nada.
- Existe ambigüedad cuando al invocar dos tablas, haces mención de un campo que puede existir en más de una con el mismo nombre. No parecería ser el caso, por lo que necesitarías que seas más preciso: Copia exactamente lo que MySQL te devuelve como mensaje. Transcipciones parciales no sirven para saber cuál es el error.

Código MySQL:
Ver original
  1. mysql> select nombre,apellido,voto,max(round(voto/t1.total*100)) ganador from pr
  2. esidentes,(select sum(voto) total from presidentes) t1 group by nombre having ro
  3. und(voto/t1.total*100) order by voto desc limit 1;
  4. ERROR 1054 (42S22): Unknown column 't1.total' in 'having clause'
  #6 (permalink)  
Antiguo 22/07/2012, 21:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Ordenar y mostrar el mayor de los votos

Bueno, en primer lugar, estás copiando incompletamente lo que yo puse. No entiendo cómo es que no te diste cuenta, pero es esto:
1) Yo no puse
Código MySQL:
Ver original
  1. HAVING round(voto/t1.total*100)
sino
Código MySQL:
Ver original
  1. HAVING ROUND(voto/t1.total*100) = max(ROUND(voto/t1.total*100))

2) No existe algo ambiguo, sino que no reconoce una columna:
Cita:
ERROR 1054 (42S22): Unknown COLUMN 't1.total' IN 'having clause'
Lo que significa que lo que no está reconociendo es la tabla derivada que se genera en la subconsulta del FROM, y esto está causado por características del HAVING. Estos detalles tienes que buscalos en el manual de referencia, que es donde se explican.

Hay una tercera cosas a tener en cuenta: Si lo que quieres es que devuelva los registros existentes en caso de un empate, no puedes poner LIMIT. Eso es absurdo, porque esa clausula sólo dejará el primer registro.

Ahora bien, probemos esto, basado en el manual de referencia, y suponiendo que la tabla "presidentes" no contiene ninguna columna denominada "total" o "ganador":
Código MySQL:
Ver original
  1.     nombre,
  2.     apellido,
  3.     voto,
  4.     ROUND(voto/total*100) ganador
  5. FROM presidentes,
  6.     (SELECT SUM(voto) total FROM presidentes) t1
  7. GROUP BY nombre
  8. HAVING max(ROUND(voto/total*100)) = ganador
__________________
¿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 22/07/2012, 22:45
 
Fecha de Ingreso: julio-2012
Ubicación: venezuela
Mensajes: 10
Antigüedad: 12 años, 4 meses
Puntos: 0
Respuesta: Ordenar y mostrar el mayor de los votos

probe y me resulto con algunas modificaciones por medio de php con algunas condiciones y un ciclo pudo solucionar gracias me quedaron muchas cosas claras saludos desde venezuela
  #8 (permalink)  
Antiguo 23/07/2012, 04:36
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Ordenar y mostrar el mayor de los votos

Cita:
probe y me resulto con algunas modificaciones por medio de php con algunas condiciones y un ciclo pudo solucionar
Si tienes que usar programación para resolverlo, entonces no sirve.
Para que una consulta sea correcta, no debe depender de componentes prograáticos, más allá de los parámetros en el WHERE. Si debes incluir iteraciones u otros elementos por fuera de SQL, entonces pederás performance, y eso es un error.
Volveré a probar para ver cuál es la forma correcta (no quería tener que crear tablas con datos para verificarlo) .
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: der, mayor, mysql, votos
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 02:38.