Ver Mensaje Individual
  #8 (permalink)  
Antiguo 25/07/2012, 11: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



La verdad es que no me caería nada mal una buena botella de vino o unos deliciosos Alfajores, pero como estoy en mi México Lindo y Querido te acompañarte con unos buenos tequilas y unos dulces de leche...

La consulta en realidad no es tan compleja, es solo cuestión de tomar algo de la experiencia con Oracle y SQL Server y aplicarla a MySQL. Como te comenté, el truco esta en simular la función ROW_NUMBER para aplicarla a MySQL... hay muchas maneras de hacerlo... la liga que te puse muestra dos de ellas que desde mi punto de vista son de las más sencillas (la página tiene muchísimos ejemplos de estas y otras consultas avanzadas que estoy seguro que te podrían servir en un futuro, deberías tomarte un tiempo largo en estudiar su contenido).

Para entender un poco mejor la consulta, lo que estás haciendo sería una especie de "producto cartesiano" entre la misma tabla... utilizas un INNER JOIN sobre la misma tabla, por naturaleza, el INNER JOIN sirve para asociar uno a uno dos registros, sin embargo observa que en la cláusula ON se utiliza una condición >=, por lo que en realidad estarías uniendo de uno a muchos... si ejecutas esta consulta, sin el COUNT(*) ni el GROUP BY te darás cuenta de cómo se hace esta unión:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     -> F1.id_album id_album_f1, F1.id_foto id_foto_f1,
  3.     -> F2.id_album id_album_f2, F2.id_foto id_foto_f2
  4.     -> FROM fotos F1
  5.     -> INNER JOIN
  6.     ->   fotos F2 ON F1.id_album = F2.id_album AND
  7.     ->   F1.id_foto >= F2.id_foto
  8.     -> ORDER BY F1.id_album, F1.id_foto;
  9. +-------------+------------+-------------+------------+
  10. | id_album_f1 | id_foto_f1 | id_album_f2 | id_foto_f2 |
  11. +-------------+------------+-------------+------------+
  12. |           1 |          1 |           1 |          1 |
  13. |           1 |          2 |           1 |          1 |
  14. |           1 |          2 |           1 |          2 |
  15. |           1 |          3 |           1 |          1 |
  16. |           1 |          3 |           1 |          2 |
  17. |           1 |          3 |           1 |          3 |
  18. |           2 |          4 |           2 |          4 |
  19. |           2 |          5 |           2 |          4 |
  20. |           2 |          5 |           2 |          5 |
  21. |           2 |          6 |           2 |          6 |
  22. |           2 |          6 |           2 |          4 |
  23. |           2 |          6 |           2 |          5 |
  24. |           3 |          7 |           3 |          7 |
  25. |           3 |          8 |           3 |          7 |
  26. |           3 |          8 |           3 |          8 |
  27. |           3 |          9 |           3 |          7 |
  28. |           3 |          9 |           3 |          8 |
  29. |           3 |          9 |           3 |          9 |
  30. |           3 |         10 |           3 |          7 |
  31. |           3 |         10 |           3 |          8 |
  32. |           3 |         10 |           3 |          9 |
  33. |           3 |         10 |           3 |         10 |
  34. +-------------+------------+-------------+------------+
  35. 22 rows in set (0.14 sec)

Observa que el número de registros de la tabla F2 con que se relaciona cada registro de la tabla F1 es justamente la posición que le corresponde, utilizando entonces la función COUNT(*) y el GROUP BY obtienes el resultado deseado. Espero que esto te ayude a entender un poco mejor la consulta.

Saludos y Salud!
Leo.