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

ordenar articulos segun votaciones a favor o en contra

Estas en el tema de ordenar articulos segun votaciones a favor o en contra en el foro de Mysql en Foros del Web. Buenas, os expongo una gran duda, gracias de antemano por leerla: Estoy intentando mostrar una lista de artículos por su popularidad (mediante votaciones). Para explicaros ...
  #1 (permalink)  
Antiguo 23/08/2011, 11:51
 
Fecha de Ingreso: febrero-2011
Mensajes: 48
Antigüedad: 13 años, 1 mes
Puntos: 0
ordenar articulos segun votaciones a favor o en contra

Buenas, os expongo una gran duda, gracias de antemano por leerla:

Estoy intentando mostrar una lista de artículos por su popularidad (mediante votaciones). Para explicaros mi duda obviare los detalles innecesarios y lo expondré como un ejemplo:

Digamos que tengo dos tablas en la base de datos.
Una, la de unos artículos, cuyos campos son: la "id" y el "nombre".
Y otra, la de los votaciones cuyos campos son: la "id", la foranea "id_articulo" y el "voto" (que puede ser solamente S ó N, que significan: me gusta o no me gusta). Y ya esta.

Mi duda es como mostrar una lista ordenada de articulos (ascendente o descendente, da igual), segun el numero de "S" o "N" (votos) que hayan recibido.

Mi duda consiste basicamente en, ¿como mostrar: en primer lugar los articulos con mayor numero de votos "S", luego de estos, los articulos sin voto alguno, y en último lugar los articulos con mayor numero de votos "N"?

Hasta donde yo he podido llegar es a crear esta query en una funcion, ubicada en una libreria, que mas tarde invoco, y seguro que está mal por lo que explico más abajo:

Código PHP:
function muestrame_articulos($voto){ //        $voto= "S"; (por ejemplo)
    
$link conexion();
    
$query "SELECT count(votaciones.voto) AS score, articulos.* FROM votaciones INNER JOIN articulos ON votaciones.id_articulo = articulos.id WHERE votaciones.voto='$voto'";
    
$rs mysql_query($query$link);
    
$resultado= array();
    
$row mysql_fetch_assoc ($rs);
    while (
$row != false) {
        
$resultado[] = $row;
        
$row mysql_fetch_assoc ($rs);
    }
    return 
$resultado
luego invoco esta funcion:
Código PHP:
    $voto"S";
    
$resultadomuestrame_articulos($voto);
    foreach(
$resultado as $item){
    echo (
"<span>"$item['nombre'] ." - "$item['score'] ." votos</span><br/>");
    } 
Pero lo que esto me ofrece es tan solo un resultado, que curiosamente es el que mas votos "S" tiene en mi ejercicio, y al lado me sale la suma de todos los votos "S" (pero de todos los articulos, no del que se muestra en el resultado de mi ejercicio). Algo así como:

Código HTML:
Articulo X lo que sea - 20 votos
Obviamente, mi interes es mostrar, en principio, todos los articulos de mi base de datos, y a su lado el numero de sus votos "S" (o "N", cuando se cambie en la variable $voto). En principio el orden ascendente o descendente es irrelevante. Solo necesito listar todos los articulos y a su lado el numero de votos respectivos.
Alguna ayuda?
Muchas Gracias
  #2 (permalink)  
Antiguo 23/08/2011, 12:32
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: ordenar articulos segun votaciones a favor o en contra

Hola Swivel:

En primer lugar, NO DEBES PONER CODIGO PHP en este foro, pues es exclusivo se MySQL. Si el problema es con lenguaje de programación, entonces puedes publicar tu pregunta en el foro dedicado a PHP, ojo para la próxima.

Segundo, no sé si entendí correctamente qué es lo que necesitas, pero hace tiempo hice algo que creo que te puede servir.

Código MySQL:
Ver original
  1. mysql> CREATE TABLE articulos (id INT, nombre VARCHAR(10));
  2. Query OK, 0 rows affected (0.27 sec)
  3.  
  4. mysql> INSERT INTO articulos VALUES
  5.     -> (1, 'uno'),(2, 'dos'),(3, 'tres'),(4, 'cuatro');
  6. Query OK, 4 rows affected (0.06 sec)
  7. Records: 4  Duplicates: 0  Warnings: 0
  8.  
  9. mysql> SELECT * FROM articulos;
  10. +------+--------+
  11. | id   | nombre |
  12. +------+--------+
  13. |    1 | uno    |
  14. |    2 | dos    |
  15. |    3 | tres   |
  16. |    4 | cuatro |
  17. +------+--------+
  18. 4 rows in set (0.01 sec)
  19.  
  20. mysql> CREATE TABLE votaciones (id INT, id_articulo INT, voto VARCHAR(1));
  21. Query OK, 0 rows affected (0.11 sec)
  22.  
  23. mysql> INSERT INTO votaciones VALUES
  24.     -> (1, 1, 'S'),(2, 1, 'N'),(3, 1, 'N'),(4, 1, 'S'),(5, 2, 'S'),(6, 2, 'N'),
  25.     -> (7, 3, 'N'),(8, 3, 'N'),(9, 3, 'S'),(10, 3, 'N'),(11, 4, 'N'),(12, 4, 'S'),
  26.     -> (13, 4, 'N'),(14, 5, 'S'),(15, 5, 'S');
  27. Query OK, 15 rows affected (0.03 sec)
  28. Records: 15  Duplicates: 0  Warnings: 0
  29.  
  30. mysql> SELECT * FROM votaciones;
  31. +------+-------------+------+
  32. | id   | id_articulo | voto |
  33. +------+-------------+------+
  34. |    1 |           1 | S    |
  35. |    2 |           1 | N    |
  36. |    3 |           1 | N    |
  37. |    4 |           1 | S    |
  38. |    5 |           2 | S    |
  39. |    6 |           2 | N    |
  40. |    7 |           3 | N    |
  41. |    8 |           3 | N    |
  42. |    9 |           3 | S    |
  43. |   10 |           3 | N    |
  44. |   11 |           4 | N    |
  45. |   12 |           4 | S    |
  46. |   13 |           4 | N    |
  47. |   14 |           5 | S    |
  48. |   15 |           5 | S    |
  49. +------+-------------+------+
  50. 15 rows in set (0.00 sec)
  51.  
  52. mysql> SELECT id_articulo,
  53.     -> SUM(CASE WHEN voto = 'S' THEN 1 ELSE 0 END) total_si,
  54.     -> SUM(CASE WHEN voto = 'N' THEN 1 ELSE 0 END) total_no,
  55.     -> SUM(CASE WHEN voto = 'S' THEN 1 ELSE 0 END) -
  56.     -> SUM(CASE WHEN voto = 'N' THEN 1 ELSE 0 END) votacion_total
  57.     -> FROM votaciones GROUP BY id_articulo
  58.     -> ORDER BY votacion_total DESC;
  59. +-------------+----------+----------+----------------+
  60. | id_articulo | total_si | total_no | votacion_total |
  61. +-------------+----------+----------+----------------+
  62. |           5 |        2 |        0 |              2 |
  63. |           1 |        2 |        2 |              0 |
  64. |           2 |        1 |        1 |              0 |
  65. |           4 |        1 |        2 |             -1 |
  66. |           3 |        1 |        3 |             -2 |
  67. +-------------+----------+----------+----------------+
  68. 5 rows in set (0.00 sec)

Si observas para cada votación positiva (S) se le otorga un punto, para cada votación negativa se le quita un punto. de tal manera que la que tenga mejor diferencia se coloca en primer lugar, aquí no importa el numero de votos, por ejemplo si hubiera un artivulo con 1000 votos positivos y 1000 votos negativos quedaría por debajo algún registro con 1 voto positivo y 0 votos negativos.

Dale un vistazo para ver si te sirve el código

Saludos
Leo.
  #3 (permalink)  
Antiguo 23/08/2011, 12:39
 
Fecha de Ingreso: febrero-2011
Mensajes: 48
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: ordenar articulos segun votaciones a favor o en contra

disculpa lo del subforo.

En cuanto a la respuesta muy agradecido. Parece muy buena idea lo de sumar y restar puntos en las votaciones. Lo guardare para mas adelante, quizas. Sin embargo, por ahora seguiré buscando una query que me muestre una lista todos los articulos y en cada uno, a su lado la suma de sus respectivos votos positivos ("S") o negativos ("N").

Gracias!!
  #4 (permalink)  
Antiguo 23/08/2011, 15:13
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: ordenar articulos segun votaciones a favor o en contra

Cita:
por ahora seguiré buscando una query que me muestre una lista todos los articulos y en cada uno, a su lado la suma de sus respectivos votos positivos ("S") o negativos ("N").
Hola de nuevo:

No entendí... dices que quieres mostrar los artículos con el respectivo numero de votos S y N, y eso es exactamente lo que hace la consulta:

Código MySQL:
Ver original
  1. +-------------+----------+----------+----------------+
  2. | id_articulo | total_si | total_no | votacion_total |
  3. +-------------+----------+----------+----------------+
  4. |           5 |        2 |        0 |               2 |
  5. |           1 |        2 |        2 |               0 |
  6. |           2 |        1 |        1 |               0 |
  7. |           4 |        1 |        2 |              -1 |
  8. |           3 |        1 |        3 |              -2 |
  9. +-------------+----------+----------+----------------+

Total_si, corresponde al número de comentarios S para el artículo en cuestión. En el mismo renglón-registro se muestra total_no, que corresponde al total de votos N, finalmente votacion_total muestra la diferencia en votos. ¿Qué es lo que falta? ¿Puedes postear algunos datos de tus tablas y decirnos qué es lo que esperas como salida?

Saludos
Leo.

Etiquetas: campos, query, sql, tabla, votos, votacion
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:58.