Последние действия пользователя – PHP MySql

Вот моя проблема: у меня есть 3 таблицы MySql, представляющие: фотографии пользователя, видеоролики, сообщения пользователя, комментарии пользователя, и мне нужно просмотреть 10 последних (20, 30, 40 …) последних действий пользователя. Например, в таблице фотографий могут быть составлены:

 user_id |  photo_id |  photo_path |  photo_name |  Дата Добавлена
    5 |  18 |  / фотографии |  pht_18.png |  2009-02-12
    5 |  21 |  / фотографии |  pht_21.png |  2009-02-15
    5 |  29 |  / фотографии |  pht_29.png |  2009-03-30 

таблица видео

 user_id |  video_id |  video_url |  Дата Добавлена
    5 |  36 |  youtube.com / ... |  2009-01-09
    5 |  48 |  youtube.com / ... |  2009-02-18
    5 |  90 |  youtube.com / ... |  2009-03-19

таблица комментариев

 user_id |  comment_id |  Комментарий |  Дата Добавлена
    5 |  6 |  Здравствуй!  |  2009-02-11
    5 |  11 |  отличная фотография |  2009-02-13
    5 |  19 |  отличный выстрел!  |  2009-03-28

Как видите, 3 таблицы имеют различное количество атрибутов, так как я могу сделать объединение? и при получении запроса результат, как я могу понять, к какой таблице он принадлежит?

Поэтому на странице профиля пользователя я хотел бы показать его недавние действия, которые, конечно, упорядочены DATE DESC следующим образом:

 2009-09-01: Пользователь отправил видео
 2009-11-02: Пользователь отправил комментарий
 2009-12-02: Пользователь добавил (а) фотографию
 2009-13-02: Пользователь добавил комментарий
 2009-15-02: Пользователь добавил (а) фотографию
 2009-18-02: Пользователь отправил видео
 2009-19-03: Пользователь отправил видео
 2009-28-03: Пользователь отправил комментарий
 2009-30-03: Пользователь опубликовал фотографию

Кто-нибудь может мне помочь?

Здесь может работать запрос MySQL UNION:

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

Тогда вы закончите с результатом, подобным

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

и так далее. (на самом деле вы можете оставить user_id из SELECT, если хотите, конечно)

Почему у вас есть отдельные таблицы в первую очередь? Вероятно, это ошибка в дизайне базы данных.

[ РЕДАКТИРОВАТЬ : Как выяснилось в комментариях и редактировании вопроса, у ОП была действительная причина для поддержания трех таблиц. Дальнейшие советы об этом удалены. ]

Чтобы решить вашу проблему, вы можете использовать UNION или 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 

Если бы это был я, я просто выполнил бы запрос к каждой таблице и выберем N самых последних элементов (упорядочить по дате_административного ограничения по убыванию N), а затем объединить их в PHP. Таким образом, вы защищены, если вам нужно разместить таблицы на отдельных физических машинах.

Вы также можете спросить себя, зачем вам 3 таблицы. Возможно, достаточно одной таблицы с окном activity_type. Вероятно, это облегчит добавление новых типов активности позже.

Лично я сделал бы другую таблицу для хранения любой активности. Это упростило бы многое, и вы также могли бы отслеживать удаления и другие действия.

Сделайте UNION на этих таблицах:

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