2009-02-18 3 views
6

Voici mon problème: J'ai 3 tables MySql représentant: des photos d'un utilisateur, des vidéos d'un utilisateur, des commentaires d'un utilisateur et j'ai besoin de voir les 10 (20, 30, 40 ...) les activités les plus récentes de l'utilisateur. Par exemple dans le tableau de photos peuvent être composées par:Activités récentes de l'utilisateur - 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 table de vidéos

 
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 table commentaires

 
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 

Comme vous pouvez le voir les 3 tableaux ont un nombre différent d'attributs , alors comment puis-je faire le syndicat? et tout en récupérant le résultat de la requête, comment puis-je comprendre à quelle table il appartient?

Ainsi, dans la page de profil de l'utilisateur Je voudrais montrer à ses activités récentes bien sûr classés par date DESC ainsi:

 
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 

Quelqu'un peut-il me aider s'il vous plaît?

+0

Vous devriez probablement éditer votre question pour montrer que les différentes tables ont des colonnes uniques, selon votre commentaire ci-dessous. –

Répondre

9

Une requête MySQL UNION pourrait fonctionner ici:

(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; 

alors vous serpentent avec un jeu de résultats comme

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

et ainsi de suite. (En fait, vous pouvez laisser user_id sur SELECT si vous voulez, bien sûr)

0

Faites un UNION sur ces tables:

(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 elle était moi, je voudrais juste faire une requête à chaque table et sélectionnez les N éléments les plus récents (ordre par date_added desc limite N), puis fusionnez-les en PHP. De cette façon, vous êtes protégé au cas où vous auriez besoin d'héberger les tables sur des machines physiques distinctes.

Vous pouvez également vous demander pourquoi vous avez besoin de 3 tables. Peut-être 1 table avec une colonne activity_type suffirait. Cela faciliterait probablement l'ajout de types d'activité plus tard.

+0

+1 pour suggérer 1 table –

+0

mon mauvais!J'ai essayé de faire un exemple simple mais j'ai mal fait car j'ai oublié de dire que la table des photos a 4 attributs (user_id, path, photoname, date), la table des vidéos a 3 attributs (user_id, youtube_video_url, date) et commentaires a 3 (user_id, commenter, date) .So nous avons des tables avec un nombre différent d'attr – AldoB

+0

comment puis-je faire l'UNION? et en PHP comment puis-je comprendre de quelle table la rangée que je vais chercher appartient? – AldoB

2

Pourquoi avez-vous des tables séparées en premier lieu? C'est probablement une erreur dans la conception de la base de données.

[EDIT: Comme il s'est avéré par des commentaires et une édition de questions, l'OP avait une raison valable pour maintenir trois tables. D'autres conseils à ce sujet ont été supprimés.]

Pour résoudre votre problème, vous pouvez utiliser UNION ou 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

J'ai fait 3 tables différentes parce que chaque élément (photo, vidéo, commentaire) a des attributs différents – AldoB

+0

de toute façon, tout en récupérant les résultats, comment puis-je comprendre à quelle table il appartient? – AldoB

+1

C'est dans la première colonne, comme une ficelle. – Tomalak

1

Personnellement, je voudrais faire une autre table pour stocker toute activité. Cela simplifierait beaucoup les choses et vous pourriez également tenir compte des suppressions et d'autres activités.

+0

Vous devriez regarder l'ensemble du contexte avant de voter. La question a été considérablement modifiée il y a 7 minutes, et je n'ai pas regardé ce sujet depuis au moins une demi-heure. Allez comprendre. – Tomalak

+0

Je peux supprimer des votes après avoir réparé votre réponse. –

+0

Un commentaire me demandant de le faire aurait été suffisant. Je suis très sensible, comme vous l'avez vu. – Tomalak