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

Ultimos 4 post de cada foro_id

Estas en el tema de Ultimos 4 post de cada foro_id en el foro de SQL Server en Foros del Web. buenas queria hacer una consula por ejemplo en foro phpbb3 del cual muestre los ultimos 4 post de cada foro especifico por ejemplo forum_id= 2 ...
  #1 (permalink)  
Antiguo 09/03/2011, 10:30
 
Fecha de Ingreso: septiembre-2010
Mensajes: 5
Antigüedad: 13 años, 7 meses
Puntos: 0
Ultimos 4 post de cada foro_id

buenas queria hacer una consula por ejemplo en foro phpbb3 del cual muestre los ultimos 4 post de cada foro especifico por ejemplo forum_id= 2 , forum_id= 5 forum_id= 7 del cual seria asi la consulta


Foro_id2 Post 1
Foro_id2 Post 2
Foro_id2 Post 3
Foro_id2 Post 4

Foro_id5 Post 1
Foro_id5 Post 2
Foro_id5 Post 3
Foro_id5 Post 4

Foro_id7 Post 1
Foro_id7 Post 2
Foro_id7 Post 3
Foro_id7 Post 4

una consulta basica que tendria solo mostrando los ultimos 10 post ordenados por forum_id
select * from phpbb_topics order by forum_id desc limit 10

teniendo encuenta que ya de por si la taba phpbb_topics contiene ya forum_id y topics_id

Gracias de antemano.
  #2 (permalink)  
Antiguo 09/03/2011, 11:09
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Ultimos 4 post de cada foro_id

Hola compañer@ cloner:

Me parece que estás copiando y pegando una misma pregunta en más de un foro verdad??? La sintaxis que estás utilizando corresponde a MySQL pues en SQL Server no existe el operador LIMIT, ojo con eso, si vas a preguntar en foros que no correspondan al manejador de BD que estás utilizando conviene que lo especifiques en el post. En SQL Server existe una función analítica llamada ROW_NUMBER() que puedes utilizar para hacer lo que necesitas, sería más o menos así:

Código SQL:
Ver original
  1. DECLARE @phpbb_topics TABLE (foro_id INT, post VARCHAR(10))
  2. INSERT INTO @phpbb_topics VALUES (2, 'Post 1')
  3. INSERT INTO @phpbb_topics VALUES (2, 'Post 2')
  4. INSERT INTO @phpbb_topics VALUES (2, 'Post 3')
  5. INSERT INTO @phpbb_topics VALUES (2, 'Post 4')
  6. INSERT INTO @phpbb_topics VALUES (5, 'Post 1')
  7. INSERT INTO @phpbb_topics VALUES (5, 'Post 2')
  8. INSERT INTO @phpbb_topics VALUES (5, 'Post 3')
  9. INSERT INTO @phpbb_topics VALUES (5, 'Post 4')
  10. INSERT INTO @phpbb_topics VALUES (7, 'Post 1')
  11. INSERT INTO @phpbb_topics VALUES (7, 'Post 2')
  12. INSERT INTO @phpbb_topics VALUES (7, 'Post 3')
  13. INSERT INTO @phpbb_topics VALUES (7, 'Post 4')
  14.  
  15. SELECT * FROM (
  16. SELECT T1.*, ROW_NUMBER() OVER (partition BY foro_id ORDER BY foro_id, post) posicion FROM @phpbb_topics T1
  17. ) T2 WHERE T2.posicion < 3

Es decir, tienes cuatro post para cada foro_id, pero el ejemplo sólo está recuperando dos de ellos, creo que sería más o menos lo que necesitas, pero lamentablemente MySQL no cuenta con esta funcionalidad. Puedes simular algo parecido al row_number, checa esta página, igual y te puede servir.

http://forums.mysql.com/read.php?32,...665#msg-225665

Saludos
Leo.
  #3 (permalink)  
Antiguo 09/03/2011, 11:49
 
Fecha de Ingreso: septiembre-2010
Mensajes: 5
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Ultimos 4 post de cada foro_id

Muchas gracias por la respuesta ya conteste en el otro foro tb xD.
  #4 (permalink)  
Antiguo 09/03/2011, 15:15
 
Fecha de Ingreso: septiembre-2010
Mensajes: 5
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Ultimos 4 post de cada foro_id

bueno lo que he hecho es esto

SELECT *
FROM phpbb_topics
right JOIN (SELECT topic_id,forum_id FROM phpbb_topics where forum_id=3 or forum_id=4 order by forum_id limit 4) AS t2
ON (phpbb_topics.topic_id = t2.topic_id) group by t2.topic_id

y me muestra los 4 post de forum_id 3 pero la idea seria por ejemplo como hacer meter otra subconsula o como si fuese un "bucle" que mostrase almenos 4 post de cada foro

y sip es mysql lo siento por la equivocacion
  #5 (permalink)  
Antiguo 09/03/2011, 17:18
 
Fecha de Ingreso: septiembre-2010
Mensajes: 5
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Ultimos 4 post de cada foro_id

SELECT *
FROM phpbb_topics
JOIN (SELECT topic_id,forum_id FROM phpbb_topics where forum_id=2 limit 4) AS t1
JOIN (SELECT topic_id,forum_id FROM phpbb_topics where forum_id=3 limit 4) AS t2
JOIN (SELECT topic_id,forum_id FROM phpbb_topics where forum_id=4 limit 4) AS t3
ON (phpbb_topics.topic_id = t3.topic_id or phpbb_topics.topic_id = t2.topic_id or phpbb_topics.topic_id = t1.topic_id)
group by phpbb_topics.topic_id order by phpbb_topics.forum_id

Con este sentencia ya me realiza bien xD
  #6 (permalink)  
Antiguo 10/03/2011, 14:58
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Ultimos 4 post de cada foro_id

Hola de nuevo compañer@ cloner:

Aunque no debería continuar con este post debido a que tu pregunta está planteada para MySQL y esto es un foro de SQL Server sí me gustaría hacerte un comentario al respecto de tu último post.

Creo que ni siquiera le echaste un vistazo a la liga que te puse. La solución que planteas es válida sólo para tres foros, pero según tu lógica si tuvieras 100 foros y quisieras obtener los últimos cuatro topic's de cada uno de ellos entonces !!!tendrías que hacer 100 JOIN's!!!, esto termina por ser poco práctico no crees???

Te pongo un script de cómo se realizaría simulando el ROW_NUMBER(), es decir la explicación de la liga que te puse... igual y no le vas a hacer caso, pero creo que si alguien más tiene un problema similar le puede ayudar.

Código MySQL:
Ver original
  1. mysql> create table phpbb_topics (forum_id int, topic_id int, campo varchar(10))
  2. ;
  3. Query OK, 0 rows affected (0.08 sec)
  4.  
  5. mysql> insert into phpbb_topics values (1, 1, '1.1'),(1, 2, '1.2'),(1, 3, '1.3')
  6. ,(1, 4, '1.4'),(1, 5, '1.5'),(2, 1, '2.1'),(2, 2, '2.2'),(2, 3, '2.3'),(3, 1, '3
  7. .1'),(3, 2, '3.2'),(3, 3, '3.3'),(3, 4, '3.4');
  8. Query OK, 12 rows affected (0.02 sec)
  9. Records: 12  Duplicates: 0  Warnings: 0
  10.  
  11. mysql> select * from phpbb_topics;
  12. +----------+----------+-------+
  13. | forum_id | topic_id | campo |
  14. +----------+----------+-------+
  15. |        1 |        1 | 1.1   |
  16. |        1 |        2 | 1.2   |
  17. |        1 |        3 | 1.3   |
  18. |        1 |        4 | 1.4   |
  19. |        1 |        5 | 1.5   |
  20. |        2 |        1 | 2.1   |
  21. |        2 |        2 | 2.2   |
  22. |        2 |        3 | 2.3   |
  23. |        3 |        1 | 3.1   |
  24. |        3 |        2 | 3.2   |
  25. |        3 |        3 | 3.3   |
  26. |        3 |        4 | 3.4   |
  27. +----------+----------+-------+
  28. 12 rows in set (0.00 sec)
  29.  
  30. mysql> #para obtener sólo los últimos dos topic's de cada forum_id
  31. mysql> SELECT T1.forum_id, T1.topic_id, T1.campo FROM(
  32.     -> SELECT o.forum_id, o.topic_id, o.campo,
  33.     -> FIND_IN_SET(o.topic_id ,
  34.     -> (
  35.     -> SELECT GROUP_CONCAT(topic_id ORDER BY topic_id DESC)
  36.     -> FROM phpbb_topics  i WHERE i.forum_id = o.forum_id)
  37.     -> ) AS rate_index FROM phpbb_topics o
  38.     -> ) T1
  39.     -> WHERE rate_index <= 2;
  40. +----------+----------+-------+
  41. | forum_id | topic_id | campo |
  42. +----------+----------+-------+
  43. |        1 |        4 | 1.4   |
  44. |        1 |        5 | 1.5   |
  45. |        2 |        2 | 2.2   |
  46. |        2 |        3 | 2.3   |
  47. |        3 |        3 | 3.3   |
  48. |        3 |        4 | 3.4   |
  49. +----------+----------+-------+
  50. 6 rows in set (0.00 sec)

Esto serviría PARA CUALQUIER NÚMERO DE FOROS.

Saludos
Leo

Etiquetas: post
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 06:40.