Ver Mensaje Individual
  #2 (permalink)  
Antiguo 04/06/2013, 08:15
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: 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.