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

Select where media + alta y + votos

Estas en el tema de Select where media + alta y + votos en el foro de Bases de Datos General en Foros del Web. Hola! Quisiera realizar un sql, de una tabla que almacena votos. Me explico: Tengo una tabla, llamada "votar" Campos: 'votos', 'votadoid' Quisiera sacar un solo ...
  #1 (permalink)  
Antiguo 10/07/2008, 15:30
(Desactivado)
 
Fecha de Ingreso: marzo-2008
Mensajes: 641
Antigüedad: 16 años, 1 mes
Puntos: 7
Select where media + alta y + votos

Hola!

Quisiera realizar un sql, de una tabla que almacena votos.

Me explico:

Tengo una tabla, llamada "votar"

Campos:

'votos', 'votadoid'

Quisiera sacar un solo resultado (votadoid), que muestre solo un registro, pero que muestre el mejor de todos.

El que tiene mayor número de votos, y además su media no es menor de 8.

Lo que yo quiero no es cualquier registro con su media de 10, sino, que su cantidad de veces votadas sea la más alta y sus votos no bajen de los 8 puntos.

por ejemplo:

caso a)= cantidadvecesvotadas> 23 mediavotos>9
caso b)=cantidadvecesvotadas> 19 mediavotos>10

Ahí se mostraría el caso (a), ya que ha sido votado más veces, y admemás su media no es menor de 8.

En este caso:

caso a)= cantidadvecesvotadas> 38 mediavotos>7
caso b)=cantidadvecesvotadas> 19 mediavotos>8
caso c)=cantidadvecesvotadas> 14 mediavotos>10

Ahí sería el caso (b), ya que su media no baja de 8, y tiene el mayor número de votos. (El caso 'a' se descarta, ya que su media es inferior a 8. El caso 'c' también, porque aunque tenga la media más alta, su cantidad de veces votadas es inferior a la del caso 'b')

Ojalá me entiendan!! Necesito esto para mostrar el mejor registro según los votos. Si hay otra forma de hacerlo, agradecería que me lo dijeran)
  #2 (permalink)  
Antiguo 10/07/2008, 15:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Select where media + alta y + votos

Tema trasladado a Bases de Datos.
  #3 (permalink)  
Antiguo 11/07/2008, 10:40
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Select where media + alta y + votos

Creo haberte entendido, pero también creo que no has considerado un par de posibilidades. Imagina que tienes dos veces el mismo máximo número de votos 20, y una media en ambos casos que es igual o superior a 8 (9,750 y 11, respectivamente). En ese caso tendrías que sacar los dos, ¿o no? E imagina esto otro, que ambos tienen la misma cantidad de votos 20 y también la misma media 11. Aquí seguro que querrías sacar los dos, porque, si no lo haces, estarías falseando el resultado. Y donde digo 2 puedo decir 3 o más.
Para hacer ambas cosas, te pongo una consulta que se me ha ocurrido, aunque no estoy seguro de que sea la única:

Cita:
SELECT v2.votadoid, COUNT(v2.votadoid) AS numervotos, AVG(v2.votos) AS mediavotos FROM votar v2 GROUP BY v2.votadoid HAVING COUNT(v2.votadoid) = (SELECT MAX(T1.numvotos) AS num FROM (SELECT COUNT(v.votadoid) as numvotos, AVG(v.votos) AS media FROM `votar` v GROUP BY v.votadoid HAVING AVG(v.votos) >=8)T1) AND AVG(v2.votos) >=8
aclaración: en la consulta escrita al final saco todos los números de votos de aquellos votadoid cuya media de votos iguala o supera 8; luego selecciono el máximo de esos números de votos y luego realizo una consulta buscando todos los votadoid cuyo número de votos coincide con ese máximo y tienen una media de votos igual o superior a 8.

Yo trabajo con MySQL. Espero que te sirva la consulta.

Última edición por jurena; 11/07/2008 a las 14:36 Razón: He corregido algún error.
  #4 (permalink)  
Antiguo 11/07/2008, 15:37
(Desactivado)
 
Fecha de Ingreso: marzo-2008
Mensajes: 641
Antigüedad: 16 años, 1 mes
Puntos: 7
Respuesta: Select where media + alta y + votos

...Muuchas gracias. Es exactamente lo que quería.

¿Dónde tendría que poner WHERE votadocateg=chistestexto?

En el final?


El problema es que no entiendo lo que me has dejado. ¿Sabes de algún manual donde se aprenda eso?

Repito: Muchas gracias

Última edición por yonolose; 11/07/2008 a las 15:52
  #5 (permalink)  
Antiguo 11/07/2008, 23:32
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Select where media + alta y + votos

Creo que va al final, pero no con where, sino tras ese HAVING último que ya tienes (WHERE no se puede poner tras GROUP BY), y también tras el HAVING de la consulta interior para sacar los votadoid que tienen esas medias. Te quedará algo así.

Cita:
SELECT v2.votadoid, COUNT(v2.votadoid) AS numervotos, AVG(v2.votos) AS mediavotos FROM votar v2 GROUP BY v2.votadoid HAVING COUNT(v2.votadoid) = (SELECT MAX(T1.numvotos) AS num FROM (SELECT COUNT(v.votadoid) as numvotos, AVG(v.votos) AS media FROM `votar` v GROUP BY v.votadoid HAVING AVG(v.votos) >=8 AND v.votadocateg=chistestexto)T1) AND AVG(v2.votos) >=8 AND v2.votadocateg=chistestexto
Te lo aclaro por partes
1) Averiguo los número de votos de cada votadoid cuya media supera o iguala 8: SELECT COUNT(v.votadoid) as numvotos, AVG(v.votos) AS media FROM `votar` v GROUP BY v.votadoid HAVING AVG(v.votos) >=8 AND v.votadocateg=chistestexto
2) Saco el mayor de ellos y para eso tengo que poner un alias (T1) a la consulta anterior:
SELECT MAX(T1.numvotos) AS num FROM (SELECT COUNT(v.votadoid) as numvotos, AVG(v.votos) AS media FROM `votar` v GROUP BY v.votadoid HAVING AVG(v.votos) >=8 AND votadocateg=chistestexto)T1
3) Ahora busco los votadoid cuyo total es el máximo y cuya media iguala o supera la establecida. SELECT v2.votadoid, COUNT(v2.votadoid) AS numervotos, AVG(v2.votos) AS mediavotos FROM votar v2 GROUP BY v2.votadoid HAVING COUNT(v2.votadoid) = 2) 3) AND AVG(v2.votos) >=8 AND v2.votadocateg=chistestexto


En cuanto a lo segundo, te diré que existen libros y páginas de SQL algo más avanzado, pero que yo al menos he aprendido mucho de las consultas que Quimfv, Seyko, gnzsoloyo, etc. ponen en el foro MySQL o en este, y también de muchas otras de flaviovitch, iislas, Tariboo007 y otros más en este y otros foros de bases de datos, y también de una página ya vieja que trata sobre MySQL, la base que uso (http://www.mysql-hispano.org/page.php?id=31&pag=1 y esta otra dirección http://www.aulaclic.es/sql/index.htm). De hecho, esta consulta se basa en otra con la que "provoqué" a Quimfv en el foro MySQL para que hiciera con MySQL un MAX(COUNT(campo)), algo que en nuestra base no funciona. Él lo hizo con subconsultas de este tipo. Y también me ayudaron las palabras de gnzsoloyo que habló una vez de algo así como "formar una cebolla" para hacer estas consultas, e ir probando por capas de dentro a fuera (como te he puesto en el ejemplo explicado), teniendo en mente (y esto ya es cosa mía) que cuando agrupo sólo puedo traerme el campo por el que agrupo y el resultado de la agrupación . Por lo demás, no puedo decirte una página concreta para buscar las consultas y tampoco donde te las enseñen a hacer, y como tú me gustaría conocerla, pues yo actúo, a falta de formación y conocimientos técnicos, por intuición y prueba-error (de hecho no sé si la que te he propuesto es la mejor posible), pero sé que cuando me encuentro con un problema de este tipo, la búsqueda en google no siempre debe empezar por el nombre de mi base (MySQL, o la que sea), sino por SQL, que es el lenguaje. No obstante, si encuentro alguna interesante te la postearé aquí.
Si recibes alguna recomendación más concreta de alguien del foro, yo también la leeré agradecido.

Última edición por jurena; 13/07/2008 a las 04:15
  #6 (permalink)  
Antiguo 12/07/2008, 05:47
(Desactivado)
 
Fecha de Ingreso: marzo-2008
Mensajes: 641
Antigüedad: 16 años, 1 mes
Puntos: 7
Respuesta: Select where media + alta y + votos

Gracias "jurena", eres un buen ayudante.

...Pero me aparece:

Unknown column 'votadocateg' in 'having clause'
  #7 (permalink)  
Antiguo 12/07/2008, 07:19
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Select where media + alta y + votos

Me olvidé de indicar la referencia de tabla de cada una de ellas, que, como ves, es distinta.

SELECT v2.votadoid, COUNT(v2.votadoid) AS numervotos, AVG(v2.votos) AS mediavotos FROM votar v2 GROUP BY v2.votadoid HAVING COUNT(v2.votadoid) = (SELECT MAX(T1.numvotos) AS num FROM (SELECT COUNT(v.votadoid) as numvotos, AVG(v.votos) AS media FROM `votar` v GROUP BY v.votadoid HAVING AVG(v.votos) >=8 AND v.votadocateg=chistestexto)T1) AND AVG(v2.votos) >=8 AND v2.votadocateg=chistestexto

EDITO Y CORRIJO MI POST ANTERIOR

Última edición por jurena; 12/07/2008 a las 07:30
  #8 (permalink)  
Antiguo 12/07/2008, 07:53
(Desactivado)
 
Fecha de Ingreso: marzo-2008
Mensajes: 641
Antigüedad: 16 años, 1 mes
Puntos: 7
Respuesta: Select where media + alta y + votos

Gracias de nuevo jurena.

...Pero me aparece ahora esto:

Unknown column 'v.votadocateg' in 'having clause'
  #9 (permalink)  
Antiguo 12/07/2008, 10:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Select where media + alta y + votos

Prueba esta:
Cita:
SELECT v2.votadoid, COUNT( v2.votadoid ) AS numervotos, AVG( v2.votos ) AS mediavotos
FROM votar v2
WHERE v2.votadocateg = 'chistestexto'
GROUP BY v2.votadoid
HAVING COUNT( v2.votadoid ) = (
SELECT MAX( T1.numvotos ) AS num
FROM (

SELECT COUNT( v.votadoid ) AS numvotos, AVG( v.votos ) AS media
FROM `votar` v
WHERE v.votadocateg = 'chistestexto'
GROUP BY v.votadoid
HAVING AVG( v.votos ) >=8 ) T1
)
AND AVG( v2.votos ) >=8 ORDER BY AVG( v2.votos ) DESC
Errores por no hacer comprobaciones: lo siento. Como puedes ver, los condicionantes del where buscan sobre los datos antes de hacer la agrupación, y los de having después, actuando sobre los datos generados por la agrupación.

Última edición por jurena; 13/07/2008 a las 01:44
  #10 (permalink)  
Antiguo 13/07/2008, 04:25
(Desactivado)
 
Fecha de Ingreso: marzo-2008
Mensajes: 641
Antigüedad: 16 años, 1 mes
Puntos: 7
Respuesta: Select where media + alta y + votos

Gracias de nuevo...

Pero ahora....


¡Ya funciona!!!,

Eres un genio ´.-) Muuuchas gracias.

De veras. Te lo agradezco muchísimo.

Un saludo: BRUBY

  #11 (permalink)  
Antiguo 13/07/2008, 05:12
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Select where media + alta y + votos

de nada, no es para tanto.
Mira este enlace, el de aulaclic http://www.aulaclic.es/sql/index.htm. Te enseña SQL y tiene bastante desarrollados los apartados de subconsultas...
Saludos

Última edición por jurena; 13/07/2008 a las 10:59
  #12 (permalink)  
Antiguo 13/07/2008, 07:40
(Desactivado)
 
Fecha de Ingreso: marzo-2008
Mensajes: 641
Antigüedad: 16 años, 1 mes
Puntos: 7
Respuesta: Select where media + alta y + votos

Gracias jurena.

De nuevo muchas gracias por el enlace, voy a verlo.

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 08:54.