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

Subconsulta LIMIT

Estas en el tema de Subconsulta LIMIT en el foro de Mysql en Foros del Web. Hola, tengo una subconsulta y me estoy volviendo loco. ¿Hay alguna forma de limitar el numero de filas devueltas por una sulconsulta ya que en ...
  #1 (permalink)  
Antiguo 13/05/2011, 05:39
 
Fecha de Ingreso: diciembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 5
Subconsulta LIMIT

Hola,

tengo una subconsulta y me estoy volviendo loco.

¿Hay alguna forma de limitar el numero de filas devueltas por una sulconsulta ya que en una subconsulta no se puede usar LIMIT?

He probado usando la subconsulta como si fuera una tabla (es decir, "...FROM (SELECT ...)") pero necesito pasarle un valor de la consulta principal y de esta forma no se puede.
  #2 (permalink)  
Antiguo 13/05/2011, 08:24
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Subconsulta LIMIT

Hola DarkWater:

La única forma de limitar el número de registros que regresa una subconsulta es poniendo condiciones en el WHERE o en el HAVING si es que tuvieras esta cláusula. Aquí creo que sería conveniente que nos explicaras mejor qué es lo que pretendes hacer. Podrías comenzar por decirnos cuál es la estructura de tus tablas y poner algunos registros de ejemplo, de esta manera tal vez podríamos encontrar alguna otra solución sin utilizar subconsultas.

Saludos
Leo.
  #3 (permalink)  
Antiguo 13/05/2011, 11:09
 
Fecha de Ingreso: diciembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 5
Respuesta: Subconsulta LIMIT

Hola leonardo_josue, gracias por responder

Tengo las siguientes tablas:

Código:
DROP TABLE IF EXISTS estadisticas_partidos;
CREATE TABLE IF NOT EXISTS estadisticas_partidos
(
  estadisticas_partido_id int(30) NOT NULL,
  partido_id int(30) NOT NULL,
  valoracion int(30) NOT NULL,
  PRIMARY KEY (estadisticas_partido_id)
);


DELETE FROM estadisticas_partidos;

INSERT INTO estadisticas_partidos (estadisticas_partido_id, partido_id, valoracion) VALUES
	(2, 0, 1500),
	(5, 0, 0),
	(6, 0, 0),
	(7, 0, 3500),
	(17, 0, 1500),
	(66, 2, 1100),
	(67, 2, 0),
	(68, 2, 0),
	(72, 2, 500),
	(73, 1, 500),
	(75, 1, 500),
	(77, 1, 0),
	(80, 1, 0);



DROP TABLE IF EXISTS estadisticas_participantes_partidos;
CREATE TABLE IF NOT EXISTS estadisticas_participantes_partidos
(
  participante_id int(30) NOT NULL,
  estadisticas_partido_id int(30) NOT NULL
);


DELETE FROM estadisticas_participantes_partidos;
INSERT INTO estadisticas_participantes_partidos (participante_id, estadisticas_partido_id) VALUES
	(2, 2),
	(3, 5),
	(1, 6),
	(4, 7),
	(5, 17),
	(4, 66),
	(1, 67),
	(3, 68),
	(2, 72),
	(2, 73),
	(4, 75),
	(1, 77),
	(3, 80);
	
	

DROP TABLE IF EXISTS partidos;
CREATE TABLE IF NOT EXISTS partidos 
(
  partido_id int(30) NOT NULL,
  nombre varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (partido_id),
  UNIQUE KEY nombre (nombre)
);


DELETE FROM partidos;
INSERT INTO partidos (partido_id, nombre) VALUES
	(0, 'Street Fighter III Third strike: Fight for the future'),
	(1, 'Street Fighter Alpha 3'),
	(2, 'The King of Fighters 98');



DROP TABLE IF EXISTS ligas;
CREATE TABLE IF NOT EXISTS ligas 
(
  liga_id int(30) NOT NULL,
  partido_id int(30) NOT NULL,
PRIMARY KEY (liga_id)
);


DELETE FROM ligas;
INSERT INTO ligas (liga_id, partido_id) VALUES
	(0, 0),
	(1, 0),
	(2, 0),
	(3, 0),
	(4, 0),
	(5, 1),
	(6, 2);



DROP TABLE IF EXISTS participantes_ligas;
CREATE TABLE IF NOT EXISTS participantes_ligas
(
  participantes_ligas_id int(30) NOT NULL,
  liga_id int(30) NOT NULL,
  participante_id int(30) NOT NULL
);


DELETE FROM participantes_ligas;
INSERT INTO participantes_ligas (participantes_ligas_id, liga_id, participante_id) VALUES
	(0, 0, 1),
	(1, 0, 2),
	(2, 0, 3),
	(3, 0, 4),
	(16, 2, 1),
	(18, 2, 5),
	(40, 4, 1),
	(41, 4, 2),
	(42, 4, 3),
	(43, 4, 4),
	(44, 4, 5),
	(91, 4, 5),
	(105, 5, 2),
	(107, 5, 1),
	(108, 5, 3),
	(111, 5, 4),
	(112, 6, 1),
	(115, 6, 3),
	(116, 6, 2),
	(118, 6, 4);


DROP TABLE IF EXISTS participantes;
CREATE TABLE IF NOT EXISTS participantes 
(
  participante_id int(30) NOT NULL,
  nombre varchar(30) NOT NULL,
  PRIMARY KEY (participante_id)
);


DELETE FROM participantes;
INSERT INTO participantes (participante_id, nombre) VALUES
	(0, 'juan'),
	(1, 'victor'),
	(2, 'maria'),
	(3, 'jesus'),
	(4, 'daniel'),
	(5, 'anastasia');
Lo que quiero es sacar para cada partido los aquellos 5 que tienen la mayor valoracion en cada partido.
Para ello uso la consulta siguiente:

Código:
SELECT DISTINCT p.partido_id,participantes.participante_id,participantes.nombre
FROM participantes,partidos p
WHERE participantes.participante_id IN (SELECT participantes.participante_id
											      FROM estadisticas_partidos, estadisticas_participantes_partidos,participantes
											      WHERE estadisticas_partidos.estadisticas_partido_id=estadisticas_participantes_partidos.estadisticas_partido_id
												    AND estadisticas_participantes_partidos.participante_id=participantes.participante_id
												    AND estadisticas_partidos.partido_id=p.partido_id
											      ORDER BY valoracion DESC)
pero la subconsulta devuelve todos los participantes en cada partido. Si se pudiera usar LIMIT en la subconsulta estaría.

Gracias.
  #4 (permalink)  
Antiguo 13/05/2011, 11:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Subconsulta LIMIT

¿Quién pone la restricción del LIMIT?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 13/05/2011, 12:43
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Subconsulta LIMIT

Hola de nuevo DarlWater: no me quedó claro cómo asignas la puntuación para cada jugador, pero creo que más o menos entendí el problema.

Mira, hace algún tiempo un compañero preguntó algo como lo que quieres hacer, y esa traer sólo los dos primeros lugares para cada categoría. Checa el post original:


Obtener X registros


En esa oportunidad le proponía simular un row_number (como ORACLE O SQL Server) para poder filtrar la información, creo que para tu caso sería lo mismo. el primer punto sería lograr una tabla donde tuviera la siguiente información.

Código:
Partido|Jugador|puntuación por jugador para el partido
en este punto no importaría que muestre todos los jugadores para cada partido, el proceso de simulación del ROW_NUMBER haría la filtración.

Te repito, dale un vistazo a la liga para que veas de lo que estoy hablando y si tienes problemas lo comentas para tratar de resolverlo juntos.

Saludos
Leo.
  #6 (permalink)  
Antiguo 13/05/2011, 13:30
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Subconsulta LIMIT

Probemos con algo así:
Código MySQL:
Ver original
  1.   id,
  2.   partido_id,
  3.   participante_id,
  4.   nombre
  5.     (@id:=@id+1) id
  6.     p.partido_id,
  7.     pa.participante_id,
  8.     pa.nombre
  9.   FROM
  10.     partidos p
  11.     INNER JOIN estadisticas_partidos ep ON ep.partido_id=p.partido_id
  12.     INNER JOIN estadisticas_participantes_partidos epp ON ep.estadisticas_partido_id=epp.estadisticas_partido_id
  13.     INNER JOIN participantes pa ON epp.participante_id = pr.participante_id
  14.     JOIN (SELECT @id:=0) T1
  15.   ORDER BY valoracion DESC) T2
  16. WHERE id<=5;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 15/05/2011, 07:18
 
Fecha de Ingreso: diciembre-2009
Mensajes: 186
Antigüedad: 14 años, 5 meses
Puntos: 5
Respuesta: Subconsulta LIMIT

Hola,

gracias los dos por responder.
LLevava ya tiempo con esta consulta y al final logré solucionarlo utilizando la función que me indicó leonardo_josue FIND_IN_SET().

Gracias.
  #8 (permalink)  
Antiguo 16/05/2011, 08:07
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Subconsulta LIMIT

Enhorabuena DarkWater, me alegra que te hayas resuelto tu problema...

Saludos
leo.

Etiquetas: limit, subconsulta
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 18:51.