Ver Mensaje Individual
  #2 (permalink)  
Antiguo 23/08/2011, 12:32
leonardo_josue
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.