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

ORDER BY 3 tablas diferentes

Estas en el tema de ORDER BY 3 tablas diferentes en el foro de Mysql en Foros del Web. Buenas, Tengo estas 3 tablas: Lo que me gustaría hacer es un SELECT que me devuelva los registros de fotos y comentarios de un usuario ...
  #1 (permalink)  
Antiguo 04/06/2013, 03:39
 
Fecha de Ingreso: junio-2013
Mensajes: 1
Antigüedad: 10 años, 10 meses
Puntos: 0
Exclamación ORDER BY 3 tablas diferentes

Buenas,

Tengo estas 3 tablas:



Lo que me gustaría hacer es un SELECT que me devuelva los registros de fotos y comentarios de un usuario ordenados por fecha y date juntos, no separados como en este caso:

Código MySQL:
Ver original
  1. SELECT fotos.id FROM usuarios, fotos WHERE usuarios.id='1' AND usuarios.id=fotos.user ORDER BY fotos.date
  2. SELECT comentarios.id FROM usuarios, comentarios WHERE usuarios.id='1' AND usuarios.id=comentarios.de ORDER BY comentarios.fecha

He probado de la siguiente manera pero me hace un producto cartesiano con las tres tablas y me devuelve todos los registros multiplicados, aparte que los ordena primero por la fecha de fotos y después por comentarios, y quiero ordenarlo todo conjuntamente:

Código MySQL:
Ver original
  1. SELECT fotos.id id_foto, comentarios.id id_com FROM usuarios, fotos, comentarios WHERE usuarios.id='1' AND usuarios.id=fotos.user AND usuarios.id=comentarios.de ORDER BY fotos.date, comentarios.fecha

Espero que alguien me pueda ayudar,
Gracias de antemano.
  #2 (permalink)  
Antiguo 04/06/2013, 08:15
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: ORDER BY 3 tablas diferentes

Hola uxtlei:

Vayamos por partes, porque lo que quieres hacer creo que no es posible, ya que estás tratando de mezclar peras con manzanas. En primer lugar, ¿cuál es la cardinalidad de tus tablas? Desde mi punto de vista un usuario puede tener n comentarios y también puede tener n fotos, entonces ¿Cómo pretendes que se hagan los JOIN's?

Al no existir ninguna relación entre FOTOS y COMENTARIOS, no puedes hacer un JOIN entre estas tablas. Si quisieras hacerlo, tendrías que cambiar la cardinalidad entre tus tablas y convertirlas en una relación 1 a 1, con un GROUP_CONCAT por ejemplo, de tal manera que te coloque en una lista separada por comas, checa el script:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM usuarios;
  2. +------+--------+-----------+
  3. | id   | nombre | apellidos |
  4. +------+--------+-----------+
  5. |    1 | uno    | one       |
  6. |    2 | dos    | two       |
  7. |    3 | tres   | three     |
  8. |    4 | cuatro | four      |
  9. +------+--------+-----------+
  10. 4 rows in set (0.03 sec)
  11.  
  12. mysql> SELECT * FROM comentarios;
  13. +------+------+------+--------------+---------------------+
  14. | id   | de   | para | texto        | fecha               |
  15. +------+------+------+--------------+---------------------+
  16. |    1 |    1 |    2 | texto uno    | 2013-06-04 08:40:11 |
  17. |    2 |    1 |    3 | texto dos    | 2013-06-04 08:40:11 |
  18. |    3 |    2 |    1 | texto tres   | 2013-06-04 08:40:11 |
  19. |    4 |    3 |    2 | texto cuatro | 2013-06-04 08:40:11 |
  20. +------+------+------+--------------+---------------------+
  21. 4 rows in set (0.00 sec)
  22.  
  23. mysql> SELECT * FROM fotos;
  24. +------+---------+---------------------+---------------+
  25. | id   | usuario | fecha               | img           |
  26. +------+---------+---------------------+---------------+
  27. |    1 |       1 | 2013-06-04 09:00:55 | imagen uno    |
  28. |    2 |       1 | 2013-06-04 09:00:55 | imagen dos    |
  29. |    3 |       2 | 2013-06-04 09:00:55 | imagen tres   |
  30. |    4 |       4 | 2013-06-04 09:00:55 | imagen cuatro |
  31. +------+---------+---------------------+---------------+
  32. 4 rows in set (0.00 sec)
  33.  
  34. mysql> SELECT u.*, c.texto, f.img
  35.     -> FROM usuarios u
  36.     -> LEFT JOIN ( SELECT de, GROUP_CONCAT(texto) texto
  37.     ->             FROM comentarios
  38.     ->             GROUP BY de) c ON c.de = u.id
  39.     -> LEFT JOIN ( SELECT usuario, GROUP_CONCAT(img) img
  40.     ->             FROM fotos
  41.     ->             GROUP BY usuario) f ON f.usuario = u.id;
  42. +------+--------+-----------+---------------------+-----------------------+
  43. | id   | nombre | apellidos | texto               | img                   |
  44. +------+--------+-----------+---------------------+-----------------------+
  45. |    1 | uno    | one       | texto uno,texto dos | imagen uno,imagen dos |
  46. |    2 | dos    | two       | texto tres          | imagen tres           |
  47. |    3 | tres   | three     | texto cuatro        | NULL                  |
  48. |    4 | cuatro | four      | NULL                | imagen cuatro         |
  49. +------+--------+-----------+---------------------+-----------------------+
  50. 4 rows in set (0.06 sec)

Otra manera de unir las tablas, sería con UNION, con las restricciones que tiene este tipo de sentencia... podrías hacer algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT usuario, fecha, img
  2.     -> FROM fotos
  3.     -> UNION
  4.     -> SELECT de usuario, fecha, texto
  5.     -> FROM comentarios
  6.     -> ORDER BY fecha;
  7. +---------+---------------------+---------------+
  8. | usuario | fecha               | img           |
  9. +---------+---------------------+---------------+
  10. |       1 | 2013-06-04 08:00:55 | imagen uno    |
  11. |       1 | 2013-06-04 08:40:11 | texto uno     |
  12. |       1 | 2013-06-04 09:04:55 | imagen dos    |
  13. |       1 | 2013-06-04 09:26:11 | texto dos     |
  14. |       2 | 2013-06-04 09:35:55 | imagen tres   |
  15. |       4 | 2013-06-04 09:59:55 | imagen cuatro |
  16. |       2 | 2013-06-04 10:05:11 | texto tres    |
  17. |       3 | 2013-06-04 11:58:11 | texto cuatro  |
  18. +---------+---------------------+---------------+
  19. 8 rows in set (0.00 sec)

Finalmente, algunas recomendaciones:

1. No hagas la unión de tus tablas en el FROM-WHERE. En lugar de esto:

Código:
...
FROM tabla1, tabla2 WHERE tabla1.campo = tabla2.campo
...
Haz esto:

Código:
...
FROM tabla1 INNER JOIN tabla2 ON tabla1.campo = tabla2.campo
...
Si tienes dudas en cómo funcionan los distintos tipos de JOIN's, preguntale a Santa WIKIPEDIA:

http://es.wikipedia.org/wiki/Join

2. Mucho cuidado con poner nombres de campos en inglés... corres el riesgo de que formen parte de las palabras reservadas de MySQL, lo que te traerá problemas al hacer las consultas. En tu tabla FOTOS tienes los campos (USER y DATE), estas son palabras reservadas... para evitar esto simplemente pon los nombres en español o agregales algún prefijo o sufijo a los campos (ID_USER, DATE_IMG...)

Saludos.
Leo.

Etiquetas: comentarios, fotos, tablas, usuarios
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 18:57.