Foros del Web » Programando para Internet » PHP »

Ordenar entradas de un blog por votos y comentarios

Estas en el tema de Ordenar entradas de un blog por votos y comentarios en el foro de PHP en Foros del Web. Hola amigos. Estoy terminando un blog que por cierto me ha quedado chulísimo (de cero, nada de wordpesste ni comidas precocinadas). Ahora me asalta una ...
  #1 (permalink)  
Antiguo 07/02/2010, 18:56
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Ordenar entradas de un blog por votos y comentarios

Hola amigos.
Estoy terminando un blog que por cierto me ha quedado chulísimo (de cero, nada de wordpesste ni comidas precocinadas).

Ahora me asalta una gran duda: quiero acabarlo con una sección de "Destacados" y en ella meter las entradas mejor votadas, más comentadas y más leídas. Las más leídas no tengo problema, ya que tengo un campo en cada entrada que suma una lectura. El problema viene con los votos y con los comentarios.
Los votos pueden ser del 1 al 5 y se hace la media, luego se redondea para que de número redondo (1,2,3,4,5) y se muestra. La tabla tiene la siguiente estructura:

votos:
user | fecha | calificacion | entrada

Entonces, cómo leer todos los votos, organizarlos por entrada y calcular la media de ellos. (hasta ahí todo bien). Y ahora? Cómo muestro los 10 más votados (contando número de votos y media)? Cómo lo ordeno en descendente? Lo mismo con los comentarios. Sería leer todos los comentarios y ver el número total por entrada, pero cómo ordenarlo? Pensé en un array pero luego cómo lo ordeno?

comentarios:
user | fecha | comentario | entrada

Espero que podáis ayudarme amigos.

Saludos.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.

Última edición por CHuLoSoY; 09/02/2010 a las 05:51 Razón: solucionado
  #2 (permalink)  
Antiguo 07/02/2010, 22:57
 
Fecha de Ingreso: agosto-2008
Mensajes: 367
Antigüedad: 16 años, 2 meses
Puntos: 5
Respuesta: Ordenar entradas de un blog por votos y comentarios

tal ves esto es lo que busques sinceramente no entendi del todo como lo quieres hacer...

pero creo que lo que puedes es traer los votos a un arreglo y las entradas a otro y alli haces la media de todos los que quieras.. y luego creo que esta es la funcion que buscas teniendo todo en arreglos los puedes ordenar asi... mira aqui que esta bien expresado

http://www.tutorialesfacil.com.ar/ph...raArreglos.htm

luego me comentas si era tu idea
  #3 (permalink)  
Antiguo 07/02/2010, 23:16
 
Fecha de Ingreso: agosto-2008
Mensajes: 367
Antigüedad: 16 años, 2 meses
Puntos: 5
Respuesta: Ordenar entradas de un blog por votos y comentarios

supongo que la media la sacas entre votos y entrada.. entonces has una consulta asi

$row=mysql_query("SELECT votos,entrada FROM tu_tabla")
while ($algo=($row)){

$entrada=$algo['entrada'];
$votos=$algo['votos'];

luego has un calculo algo como $resultado=($votos/$entrada);

cuando tengas todos los resultados en variables los ordenas de la forma aqui explicada a la perfeccion ,

http://www.tutorialesfacil.com.ar/ph...raArreglos.htm
  #4 (permalink)  
Antiguo 08/02/2010, 07:31
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Ordenar entradas de un blog por votos y comentarios

Wow, buena entrada! Justo lo que necesitaba. ME has entendido bien, lo que pasa es que de una bd no lo puedo sacar ordenado, a no ser que sume y haga medias en el SQL, el cual no me parece óptimo. Almacenaré todo en un array y lo ordenaré con rsort!

Grcias amigo.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #5 (permalink)  
Antiguo 08/02/2010, 10:28
 
Fecha de Ingreso: agosto-2008
Mensajes: 367
Antigüedad: 16 años, 2 meses
Puntos: 5
Respuesta: Ordenar entradas de un blog por votos y comentarios

me parece lo mejor almacenalo todo en array y divide votos por entrada ($votos/$entrada)
cuanto los tengas todos ulilizas la funcion rsort.


suerte y a las ordenes
  #6 (permalink)  
Antiguo 08/02/2010, 11:01
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Ordenar entradas de un blog por votos y comentarios

Bueno, más bien dividiré $totalcalificaciones / $totaldevotos en cada entrada ;)
Gracias amigo.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #7 (permalink)  
Antiguo 08/02/2010, 16:32
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Ordenar entradas de un blog por votos y comentarios

Publico mis resultados. Ha salido a la perfección:

Código PHP:
Ver original
  1. $con=mysql_connect($dbserver,$dbuser,$dbpass);
  2. mysql_select_db($db,$con);
  3.  
  4. $sql="SELECT * FROM entradas";
  5. $rs=mysql_query($sql,$con) or die ("Error.   ". mysql_error());
  6.  
  7.  
  8.     while($fila=mysql_fetch_array($rs)) {
  9.         $sq2l="SELECT * FROM votos WHERE entrada=".$fila['id'];
  10.         $r=mysql_query($sq2l,$con) or die ("Error.  ". mysql_error());
  11.             $totlvots=mysql_num_rows($r);
  12.             $vots=0;
  13.             while($cosillas=mysql_fetch_array($r)) {
  14.                 $vots=$vots+$cosillas['calificacion'];
  15.             }
  16.             $media=$vots/$totlvots;
  17.            
  18.             $elementos[$fila['id']]=$media;
  19.         mysql_free_result($r);
  20.     }
  21.  
  22.  
  23. rsort($elementos);
  24.  
  25. foreach($elementos as $clave=>$valor) {
  26.  
  27.     echo $clave ." =&gt; ".$valor."<br>";
  28. /* Esto imprime:
  29. 0 => 5
  30. 1 => 4.235222
  31. 2 => 4.222222
  32. 3 => 4
  33. 4 => 3.777777
  34.  
  35. En el cuatro para aunque haya más entradas, con la instrucción siguiente:*/
  36.  
  37.     if($clave==4) { break; } //Sólo muestro los cinco resultados más votados
  38. }

Saludos y gracias por el enlace!
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #8 (permalink)  
Antiguo 08/02/2010, 17:57
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: Ordenar entradas de un blog por votos y comentari

Hola amigos, me ha surgido un problema. Cómo puedo hacer el rsort() sin que me cambie los índices del array? En los índices designo el ID de la entrada. Si le añado un elemento más al array se complica la ordenación.

Saludos

EDITO:
Ya está, encontré la funcion arsort() que funciona como rsort() [igual que asort() como sort()] que mantiene los índices del array. Al final:

Código PHP:
Ver original
  1. $con=mysql_connect($dbserver,$dbuser,$dbpass);
  2. mysql_select_db($db,$con);
  3.  
  4. $sql="SELECT * FROM entradas";
  5. $rs=mysql_query($sql,$con) or die ("Error.   ". mysql_error());
  6.  
  7.  
  8.     while($fila=mysql_fetch_array($rs)) {
  9.         $sq2l="SELECT * FROM votos WHERE entrada=".$fila['id'];
  10.         $r=mysql_query($sq2l,$con) or die ("Error.  ". mysql_error());
  11.             $totlvots=mysql_num_rows($r);
  12.             $vots=0;
  13.             while($cosillas=mysql_fetch_array($r)) {
  14.                 $vots=$vots+$cosillas['calificacion'];
  15.             }
  16.             $media=$vots/$totlvots;
  17.            
  18.             $elementos[$fila['id']]=$media;
  19.         mysql_free_result($r);
  20.     }
  21.  
  22.  
  23. arsort($elementos);
  24.  
  25. $i=0; //vamos a controlar hasta llegar a cinco
  26.  
  27. foreach($elementos as $clave=>$valor) {
  28.  $i++; //sumamos uno
  29.  
  30.     echo $clave ." =&gt; ".$valor." puntos<br>";
  31. /* Esto imprime:
  32. 58 => 5 puntos
  33. 52 => 4.235222 puntos
  34. 43 => 4.222222 puntos
  35. 64 => 4 puntos
  36. 59 => 3.777777 puntos
  37. */
  38.     if($i==5) { break; } //Sólo muestro los cinco resultados más votados
  39. }

Saludos y gracias a todos.
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.

Última edición por CHuLoSoY; 08/02/2010 a las 19:18
  #9 (permalink)  
Antiguo 08/02/2010, 22:59
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: [sin solucionar todavía] Ordenar entradas de un blog por votos y comentari

Revisando rapidamente encontre esto: http://www.java2s.com/Tutorial/MySQL...s/Division.htm

Donde se sugiere que tal vez seria posible algo como esto:

SELECT campo1/campo2 AS pseudocampo FROM tabla ORDER BY pseudocampo DESC

Suponiendo que funcione solo faltaria ver si da problemas cuando ambos campos esten en cero... bastaria con filtrarlos para mostrar solo las entradas que si estan valoradas.
__________________
- León, Guanajuato
- GV-Foto
  #10 (permalink)  
Antiguo 09/02/2010, 05:40
N4X
 
Fecha de Ingreso: enero-2010
Mensajes: 23
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: [sin solucionar todavía] Ordenar entradas de un blog por votos y comentari

como dice triby la solución a tus problemas está en el SQL y no en el PHP...



el tema está agregar un "ORDER BY [ASC|DESC] campo "

a tu query, y con eso solucionas el tema de mostrar los mas votados.

También agrega un "LIMIT 0,10" creo que era o sino 10,0.

saludos
nax
  #11 (permalink)  
Antiguo 09/02/2010, 05:51
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: [sin solucionar todavía] Ordenar entradas de un blog por votos y comentari

Gracias amigos, lo del sql fue lo primero que pensé, pero no es factible debido a que participan varias tablas en el tema.
La solución que conseguí la puse arriba y funciona perfecto con arsort (conservando los índices). Así leo los cinco primeros y el índice es el identificador de la entrada, con lo que ya está solucionado tanto para los votos como para los comentarios.

Gracias por sus respuestas.

PD: Pondría solucionado en el título pero no me deja cambiarlo-
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #12 (permalink)  
Antiguo 09/02/2010, 10:42
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: [sin solucionar todavía] Ordenar entradas de un blog por votos y comentari

Genial!... veamos como se comporta el script cuando tengas unas mil entradas.
__________________
- León, Guanajuato
- GV-Foto
  #13 (permalink)  
Antiguo 09/02/2010, 11:11
Avatar de CHuLoSoY  
Fecha de Ingreso: febrero-2002
Ubicación: Ribeira (Galicia)
Mensajes: 1.900
Antigüedad: 22 años, 9 meses
Puntos: 29
Respuesta: [sin solucionar todavía] Ordenar entradas de un blog por votos y comentari

Ya lo sé. Por ahora se comporta muuuy bien con casi 600 registros de votos.
Lo del sql no es factible porque cómo haces para calcular una media? No es dividir. Hablando coloquialmente en lenguaje SQL () sería algo así:

SELECT calificacion/totaldevotos AS mediaAritmetica

y de dónde saco el totaldevotos? Y el error de división por cero cuando no hay votos pero sí entrada? Es demasiado rebuscado y seguro que daría muchos problemas.

No sé, tú seguramente seas más experto. ¿Qué consejo me darías?
__________________
ESQUIO Dominios y Hosting
Las mejores características con los mejores precios.
  #14 (permalink)  
Antiguo 09/02/2010, 11:39
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: Ordenar entradas de un blog por votos y comentarios

Tanto como experto no lo soy, pero me imagino que recorrer toda la tabla de entradas y despues todos los votos de cada entrada para contar y dividir no va a ser realmente optimo.

Por lo que veo hay dos opciones:
1- Colocas un campo donde almacenes la media de votos para cada entrada
2- Intentas hacer las operaciones directamente desde la consulta, usando SUM y COUNT, aunque no estoy seguro que funcione, ya nos diras cuando lo pruebes:

SELECT entrada, COUNT(entrada) as votos, SUM(calificacion) as calificacion, calificacion/votos as media FROM tabla GROUP BY entrada ORDER BY media DESC LIMIT 10

Suponiendo que funcione, con esa consulta obtendrias la id de las 10 entradas mejor calificadas y te quedarian 3 opciones:

1- JOIN para obtener toda la informacion de las entradas y ejecutar todo desde la misma consulta
2- Armar una cadena para que leas las entradas con WHERE id IN (...)
3- Recorrer el resultado de votos y hacer una consulta para obtener cada entrada

Edito: Ahora que recuerdo, yo como lo hago es que en la tabla de entradas tengo un campo para votos y otro para media, cuando se agrega una nueva valoracion solo actualizo:

Cita:
total = (media * votos) + nueva valoracion
votos = votos + 1
media = total / votos
Ciertamente corro el riesgo de que en algun momento uno o mas votos no sean considerados, pero es mas facil ejecutar una vez al mes un script de verificacion que hacer todas las operaciones en cada consulta.
__________________
- León, Guanajuato
- GV-Foto

Etiquetas: blog, comentarios, entradas, 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 10:24.