MySQL - Ayuda con una consulta mysql

 
Vista:
sin imagen de perfil

Ayuda con una consulta mysql

Publicado por Pablo (2 intervenciones) el 21/01/2014 03:00:09
Hola,

Estoy atorado con una consulta mysql que estoy realizando con PDO, la cosa está así:

- Tengo un sitio web en el que los usuarios pueden "votar" (rep_up) o (rep_down) que se adjunta a un "comentario", lo que quiero realizar es como los usuarios pueden votar constantes veces (primero va a rep_up, si rep_up está en 1 el siguiente voto sería rep_down y así consecutivamente).

Lo que quiero logar:

- Básicamente mostrar un listado de los últimos usuarios que han votado por "rep_up" y ocultar cualquier usario que haya votado anteriormente por "rep_up" si tienen un "rep_down" reciente. Por lo que he comenzado la consulta de esta manera.

La tabla contiene los siguientes datos:

id: con AI (identificador del mensaje/voto)
receiver_ban_id: Número de a dónde ha ido el voto + comentario
poster_nick: Nick del usuario que ha posteado
poster_id: ID del usuario que ha posteado
rep_up: 1/0, si es 1 entonces rep_down es 0
rep_down: 1/0, si es 1 entonces rep_up es 0
date: fecha del mensaje + voto
message: el mensaje


Ahora bien, la consulta que tengo es la siguiente, casi llego al resultado pero... ya verán a continuación.

1
SELECT DISTINCT(`poster_id`), MAX(`id`) AS id,`poster_nick`,`rep_up`,`rep_down` FROM `messages` WHERE (`id`) IN (SELECT DISTINCT `id` FROM `messages` WHERE `receiver_ban_id` = 1 AND `rep_up` = 1 OR `rep_down` = 1) GROUP BY `poster_id` ORDER BY `id` ASC

En la tabla tengo varios registros con receiver_ban_id = 1, con distintos nombres, etc y me regresa 2 filas, lo cual es lo deseado, ya que está seleccionando y agrupando los `poster_id` que solamente tengo 3 distintos para probar.

Esta consulta me regresa lo siguiente:
1
2
3
4
5
6
-------------------------------------------------------------------------------------
-- poster_id ------ id ------- poster_nick ----- rep_up ---- rep_down
-- 2 ----------------- 6 -------- Nickname 2 ----- 1 ------------ 0 -----------
-- 3 ----------------- 8 -------- Nickname 3 ----- 1 ------------ 0 -----------
-- 1 ----------------- 16 ------ Nickname 1 ----- 1 ------------- 0 -----------
---------------------------------------------------------------------------------------

El problema es que al parecer siempre me regresa rep_up 1 aunque esté en 0, cómo se podría arreglar?
Digo, también existe la solución de quitar rep_up y rep_down de la consulta y luego realizar el query por cada uno de los resultados para ver su rep_up y rep_down. Pero no quiero hacerlo ya que en algún momento se regresarán 100 resultados lo cual multiplicaría el número de consultas realizadas por nada.

Muchas gracias!


Adjunto la tabla con su estructura por si la requieren / confunden con mi explicación jajaja.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
 
 
CREATE TABLE IF NOT EXISTS `messages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `deleted` int(11) NOT NULL COMMENT '1 if user deleted this message',
  `receiver_ban_id` int(11) NOT NULL,
  `receiver_user_id` int(11) NOT NULL,
  `poster_isadmin` int(11) NOT NULL COMMENT '0 to obtain data from steam_data, if 1 then obtain data from admins',
  `poster_nick` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
  `poster_id` int(11) NOT NULL,
  `rep_up` int(11) NOT NULL,
  `rep_down` int(11) NOT NULL,
  `replying_to_message_id` int(11) NOT NULL,
  `replying_to_message_nick` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
  `date` datetime NOT NULL,
  `message` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Ayuda con una consulta mysql

Publicado por Pablo (2 intervenciones) el 21/01/2014 03:28:43
Epa... ya lo resolví =_= . . .


Siempre me pasa, cuando pido ayuda a los 5 minutos encuentro la solución, pueden cerrar el post u.u

Esta fue la ganadora.

1
SELECT MAX(`poster_id`), MAX(`id`) AS id,`poster_nick`,`rep_up`,`rep_down` FROM `messages` WHERE `receiver_ban_id` = 1 AND (`rep_up` = 1 OR `rep_down` = 1) GROUP BY `poster_id` ORDER BY `id` ASC

Tan simple que es, pero bueno...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 796
Oro
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Ayuda con una consulta mysql

Publicado por xve (1151 intervenciones) el 21/01/2014 10:53:00
Gracias por compartirlo Pablo!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar