用户最近的活动 - PHP MySql

时间:2009-02-18 17:03:44

标签: php mysql

这是我的问题:我有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

正如您所看到的3个表具有不同数量的属性,那么我该如何进行联合?并且在获取查询结果时,我如何理解它属于哪个表?

因此,在用户个人资料页面中,我想通过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 个答案:

答案 0 :(得分:10)

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中移出

答案 1 :(得分:3)

为什么你首先要有单独的表格?这可能是数据库设计中的一个错误。

[ 编辑 :通过评论和问题编辑,OP有一个合理的理由来维护三个表格。关于此的进一步建议被删除。]

要解决您的问题,您可以使用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

答案 2 :(得分:3)

就个人而言,我会创建另一个表来存储任何活动。它会简化很多事情,你也可以跟踪删除和其他活动。

答案 3 :(得分:1)

如果是我,我只会对每个表进行查询并选择N个最新项(按date_added desc limit N排序),然后在PHP中合并它们。这样,您就可以受到保护,以防您需要在不同的物理机器上托管表。

您也可以问自己为什么需要3张桌子。也许1个带有activity_type列的表就足够了。这可能会使以后添加更多活动类型变得更容易。

答案 4 :(得分:0)

对这些表格执行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;