2009-02-18 20 views
6

Aquí está mi problema: Tengo 3 tablas MySql que representan: fotos de una publicación de usuario, videos de una publicación de usuario, comentarios de una publicación de usuario y necesito ver el 10 (20, 30, 40 ...) las actividades más recientes del usuario. Por ejemplo en la tabla fotos puede estar compuesto por:Actividades recientes del usuario - PHP MySql

 
user_id | photo_id | photo_path | photo_name | date_added 
    5 |  18  | /photos | pht_18.png | 2009-02-12 
    5 |  21  | /photos | pht_21.png | 2009-02-15 
    5 |  29  | /photos | pht_29.png | 2009-03-30 

la tabla vídeos

 
user_id | video_id | video_url  | date_added 
    5 |  36  | youtube.com/... | 2009-01-09 
    5 |  48  | youtube.com/... | 2009-02-18 
    5 |  90  | youtube.com/... | 2009-03-19 

la mesa de comentarios

 
user_id | comment_id | comment  | date_added 
    5 |  6  | hi!   | 2009-02-11 
    5 |  11  | great photo | 2009-02-13 
    5 |  19  | nice shot! | 2009-03-28 

Como se puede ver las 3 mesas tienen diferente número de atributos Entonces, ¿cómo puedo hacer la unión? y mientras obtengo el resultado de la consulta, ¿cómo puedo entender a qué tabla pertenece?

Así, en la página de perfil de usuario que me gustaría mostrar sus recientes actividades del curso ordenado por Desc Fecha de esta manera:

 
2009-09-01: user posted a video 
2009-11-02: user posted a comment 
2009-12-02: user posted a photo 
2009-13-02: user posted a comment 
2009-15-02: user posted a photo 
2009-18-02: user posted a video 
2009-19-03: user posted a video 
2009-28-03: user posted a comment 
2009-30-03: user posted a photo 

Puede alguien ayudarme por favor?

+0

Probablemente debería editar su pregunta para mostrar que las diferentes tablas tienen algunas columnas únicas, según su comentario a continuación. –

Respuesta

9

consulta MySQL Un UNIÓN podría funcionar aquí:

(SELECT `user_id`, `date_added`, 'photo' AS `type` FROM `photos` WHERE `user_id` = uid) UNION 
(SELECT `user_id`, `date_added`, 'video' AS `type` FROM `videos` WHERE `user_id` = uid) UNION 
(SELECT `user_id`, `date_added`, 'comment' AS `type` FROM `comments` WHERE `user_id` = uid) 
ORDER BY `date_added` DESC; 

Entonces acabaría con un conjunto de resultados como

user_id | date_added | type 
    5 | 2009-01-03 | photo 
    5 | 2008-12-07 | video 
    5 | 2008-11-19 | comment 

y así sucesivamente. (En realidad se puede dejar user_id fuera del SELECT si lo desea, por supuesto)

0

Hacer un UNION en estas tablas:

(SELECT "photo" AS `table`, `date_added` FROM `photos` ORDER BY `date_added` LIMIT 10) 
UNION 
(SELECT "video" AS `table`, `date_added` FROM `videos` ORDER BY `date_added` LIMIT 10) 
UNION 
(SELECT "comment" AS `table`, `date_added` FROM `comments` ORDER BY `date_added` LIMIT 10) 
ORDER BY `date_added` DESC 
LIMIT 10; 
1

Si fuera yo, me gustaría hacer una consulta a cada mesa y seleccione los N elementos más recientes (ordene por date_added desc límite N), y luego combínelos en PHP. De esta forma, estará protegido en caso de que necesite alojar las tablas en máquinas físicas separadas.

También puede preguntarse por qué necesita 3 tablas. Tal vez 1 tabla con una columna activity_type sería suficiente. Eso probablemente haría más fácil agregar más tipos de actividades más tarde.

+0

+1 por sugerir 1 tabla –

+0

mi mal!He intentado hacer un ejemplo simple pero lo he hecho mal porque me olvidé de decir que la tabla de fotos tiene 4 atributos (user_id, path, photoname, date), la tabla de videos tiene 3 atributos (user_id, youtube_video_url, date) y los comentarios tienen 3 (user_id, comment, date). Así que tenemos tablas con diferente número de attr – AldoB

+0

¿cómo puedo hacer UNION? y en php ¿cómo puedo entender de qué tabla pertenece la fila que estoy buscando? – AldoB

2

¿Por qué tiene mesas separadas en primer lugar? Probablemente sea un error en el diseño de la base de datos.

[EDITAR: Al final resultó que a través de comentarios y editar una pregunta, el PO tenía una razón válida para mantener tres tablas. Más consejos sobre esto eliminado.]

para resolver su problema, puede utilizar UNION o UNION ALL:

(SELECT 'photo' AS item_type, date_added, user_id FROM photos) 
UNION ALL 
(SELECT 'video' AS item_type, date_added, user_id FROM videos) 
UNION ALL 
(SELECT 'comment' AS item_type, date_added, user_id FROM comments) 
ORDER BY date_added DESC 
+0

He hecho 3 tablas diferentes porque cada elemento (foto, video, comentario) tiene diferentes atributos – AldoB

+0

de todos modos, mientras obtengo los resultados, ¿cómo puedo saber a qué tabla pertenece? – AldoB

+1

Está en la primera columna, como una cadena. – Tomalak

1

En lo personal, me gustaría hacer otra para almacenar cualquier actividad. Simplificaría mucho las cosas y también podría realizar un seguimiento de las eliminaciones y otras actividades.

+0

Debería ver todo el contexto antes de votar negativamente. La pregunta fue editada sustancialmente hace 7 minutos, y no he visto este hilo durante al menos media hora. Imagínate. – Tomalak

+0

Puedo eliminar los votos desfavorables después de corregir su respuesta. –

+0

Un comentario que me pide que lo haga habría sido suficiente. Soy bastante receptivo, como has visto. – Tomalak

Cuestiones relacionadas