Ver Mensaje Individual
  #4 (permalink)  
Antiguo 25/07/2012, 09:34
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: Consulta con resultas limitados

Hola PibeJava:

Hace tiempo discutía con algunos compañeros acerca de un problema similar, les propuse una solución que igual te puede servir. supongamos que tenemos la siguiente información:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM albumes;
  2. +----------+------------+-------------+
  3. | id_album | titulo     | descripcion |
  4. +----------+------------+-------------+
  5. |        1 | Album Uno  | Desc Uno    |
  6. |        2 | Album Dos  | Desc Dos    |
  7. |        3 | Album Tres | Desc Tres   |
  8. +----------+------------+-------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM fotos;
  12. +---------+----------+---------+----------------+
  13. | id_foto | id_album | titulo  | descripcion    |
  14. +---------+----------+---------+----------------+
  15. |       1 |        1 | Foto 1  | Foto 1-Album 1 |
  16. |       2 |        1 | Foto 2  | Foto 2-Album 1 |
  17. |       3 |        1 | Foto 3  | Foto 3-Album 1 |
  18. |       4 |        2 | Foto 4  | Foto 1-Album 2 |
  19. |       5 |        2 | Foto 5  | Foto 2-Album 2 |
  20. |       6 |        2 | Foto 6  | Foto 3-Album 2 |
  21. |       7 |        3 | Foto 7  | Foto 1-Album 3 |
  22. |       8 |        3 | Foto 8  | Foto 2-Album 3 |
  23. |       9 |        3 | Foto 9  | Foto 3-Album 3 |
  24. |      10 |        3 | Foto 10 | Foto 4-Album 3 |
  25. +---------+----------+---------+----------------+
  26. 10 rows in set (0.01 sec)

Supongamos ahora que queremos mostrar sólo las 2 primeras fotos para cada album. La idea es simular la función ROW_NUMBER de Oracle o SQL Server para numerar cada registro... hay muchas formas de hacerlo, pero para este ejemplo lo hacemos con un COUNT (más información en la liga):

http://www.artfulsoftware.com/infotree/queries.php#1098

de esta forma quedaría una consulta así:

Código MySQL:
Ver original
  1. mysql> SELECT F1.id_foto, F1.id_album, COUNT(*) AS row_number
  2.     ->    FROM fotos F1
  3.     ->    INNER JOIN
  4.     ->      fotos F2 ON F1.id_album = F2.id_album AND
  5.     ->      F1.id_foto >= F2.id_foto
  6.     ->    GROUP BY F1.id_album, F1.id_foto;
  7. +---------+----------+------------+
  8. | id_foto | id_album | row_number |
  9. +---------+----------+------------+
  10. |       1 |        1 |          1 |
  11. |       2 |        1 |          2 |
  12. |       3 |        1 |          3 |
  13. |       4 |        2 |          1 |
  14. |       5 |        2 |          2 |
  15. |       6 |        2 |          3 |
  16. |       7 |        3 |          1 |
  17. |       8 |        3 |          2 |
  18. |       9 |        3 |          3 |
  19. |      10 |        3 |          4 |
  20. +---------+----------+------------+
  21. 10 rows in set (0.03 sec)

Con esta consulta, simplemente filtramos los registros que tengan un row_number > 2... al utilizar una función COUNT(*) lo podemos hacer con una sentencia HAVING COUNT(*) <= 2. El resto sería simplemente hacer los JOIN's, incluyendo esta nueva tabla para filtrar la información, es decir, algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> A.id_album, A.titulo, A.descripcion,
  3.     -> F.id_foto, F.titulo, F.descripcion
  4.     -> FROM albumes A
  5.     -> INNER JOIN fotos F ON A.id_album = F.id_album
  6.     -> INNER JOIN
  7.     ->   (SELECT F1.id_foto, F1.id_album, COUNT(*) AS row_number
  8.     ->    FROM fotos F1
  9.     ->    INNER JOIN
  10.     ->      fotos F2 ON F1.id_album = F2.id_album AND
  11.     ->      F1.id_foto >= F2.id_foto
  12.     ->    GROUP BY F1.id_album, F1.id_foto
  13.     ->    HAVING COUNT(*) <= 2) T
  14.     ->  ON T.id_foto = F.id_foto AND T.id_album = F.id_album;
  15. +----------+------------+-------------+---------+--------+----------------+
  16. | id_album | titulo     | descripcion | id_foto | titulo | descripcion    |
  17. +----------+------------+-------------+---------+--------+----------------+
  18. |        1 | Album Uno  | Desc Uno    |       1 | Foto 1 | Foto 1-Album 1 |
  19. |        1 | Album Uno  | Desc Uno    |       2 | Foto 2 | Foto 2-Album 1 |
  20. |        2 | Album Dos  | Desc Dos    |       4 | Foto 4 | Foto 1-Album 2 |
  21. |        2 | Album Dos  | Desc Dos    |       5 | Foto 5 | Foto 2-Album 2 |
  22. |        3 | Album Tres | Desc Tres   |       7 | Foto 7 | Foto 1-Album 3 |
  23. |        3 | Album Tres | Desc Tres   |       8 | Foto 8 | Foto 2-Album 3 |
  24. +----------+------------+-------------+---------+--------+----------------+
  25. 6 rows in set (0.06 sec)

Observa que sólo te trae dos fotos por cada album, que creo que es lo que pretendes...

Sale un vistazo, creo que te puede servir. Si tienes problemas para entender alguna parte de la consulta me la comentas y lo vemos.

Saludos
Leo.