Вот моя проблема: у меня есть 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;