Недавние действия пользователя - PHP MySql - PullRequest
7 голосов
/ 18 февраля 2009

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

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 

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

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

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

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

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

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

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

Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 5 ]

10 голосов
/ 18 февраля 2009

Запрос 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, если хотите, конечно)

3 голосов
/ 18 февраля 2009

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

3 голосов
/ 18 февраля 2009

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

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

Для решения вашей проблемы вы можете использовать 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
1 голос
/ 18 февраля 2009

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

Вы также можете спросить себя, зачем вам 3 таблицы. Возможно, 1 таблицы со столбцом Activity_type будет достаточно. Это, вероятно, упростит добавление новых типов активности позже.

0 голосов
/ 18 февраля 2009

Сделайте 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...