Ver Mensaje Individual
  #6 (permalink)  
Antiguo 03/11/2010, 15:30
Avatar de mayid
mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 1 mes
Puntos: 101
Respuesta: sistema de rating (ON DUPLICATE UPDATE) y promedio

Mil gracias por las respuestas!

Tengo dos tablas ( no las construi yo, sino que son una traduccion al español de un sistema que ya existia, pero que en PHP y cantidad de consultas era ineficiente ).

Una de las tablas guarda cada voto (la ip del usuario, su puntuacion, el id de la fotografia). Es decir, aqui se listan todos los votos.

La otra tabla guarda promedios (un id autoincremetal, la cantidad de votos para una foto, el promedio, el id de la foto ).

Quizas estas dos tablas puedan plantearse mejor, pero a mi me vale.

Lo que necesito es que cuando un usuario hace click en las estrellitas de rating, su puntuacion se guarde en la tabla de ips, y se actualice la cantidad de votos y el promedio en la tabla de votos.

Esta es la estructura que tengo:

Código MySQL:
Ver original
  1. -- --------------------------------------------------------
  2.  
  3. --
  4. -- Estructura de tabla para la tabla `ips_puntuaciones`
  5. --
  6.  
  7. CREATE TABLE IF NOT EXISTS `ips_puntuaciones` (
  8.   `ip` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
  9.   `id_foto` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
  10.   `puntaje` decimal(2,1) NOT NULL DEFAULT '0.0'
  11. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  12.  
  13. --
  14. -- Volcar la base de datos para la tabla `ips_puntuaciones`
  15. --
  16.  
  17. INSERT INTO `ips_puntuaciones` (`ip`, `id_foto`, `puntaje`) VALUES
  18. ('127.0.0.1', '2', '4.1'),
  19. ('127.0.0.1', '1', '3.2'),
  20. ('127.0.0.1', '4', '2.6'),
  21. ('127.0.0.1', '3', '2.4'),
  22. ('127.0.0.1', '26', '4.0'),
  23. ('127.0.0.1', '31', '5.0'),
  24. ('127.0.0.1', '30', '4.0'),
  25. ('127.0.0.1', '28', '4.0'),
  26. ('127.0.0.1', '27', '4.0'),
  27. ('127.0.0.1', '29', '4.0');
  28.  
  29. -- --------------------------------------------------------
  30.  
  31. --
  32. -- Estructura de tabla para la tabla `puntuaciones`
  33. --
  34.  
  35. CREATE TABLE IF NOT EXISTS `puntuaciones` (
  36.   `puntuaciones` int(10) unsigned NOT NULL DEFAULT '0',
  37.   `promedio` decimal(65,1) NOT NULL DEFAULT '0.0',
  38.   `id_foto` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
  39.   PRIMARY KEY (`id`),
  40.   UNIQUE KEY `id_foto` (`id_foto`)
  41. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=12 ;
  42.  
  43. --
  44. -- Volcar la base de datos para la tabla `puntuaciones`
  45. --
  46.  
  47. INSERT INTO `puntuaciones` (`id`, `puntuaciones`, `promedio`, `id_foto`) VALUES
  48. (1, 1, '4.1', '2'),
  49. (2, 1, '3.2', '1'),
  50. (3, 1, '2.6', '4'),
  51. (4, 1, '2.4', '3'),
  52. (6, 1, '4.0', '26'),
  53. (7, 1, '5.0', '31'),
  54. (8, 1, '4.0', '30'),
  55. (9, 1, '4.0', '28'),
  56. (10, 1, '4.0', '27'),
  57. (11, 1, '4.0', '29');

Gonzalo: me encantaría usar algun metodo de mysql para calcular el nuevo promedio al ingresar la nueva puntuacion... Por ahora estoy con la consulta que ves en mi primer mensaje.