2009-02-18 48 views
6

这是我的问题:我有3个MySql表代表:照片用户发布,视频用户帖子,评论用户帖子,我需要查看10(20,30,40 ... )用户最近的活动。 例如,在照片表可由组成:用户最近的活动 - 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 

视频表

 
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 

comments表

 
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个表有不同数量的属性,那么我该怎么做这个工会呢?并在获取查询结果的同时,我怎么理解到它属于哪个表?

所以在用户的​​个人资料页,我想表现出他最近的课程,由日期降序排序这样的活动:

 
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 

谁能帮助我吗?

+0

您应该编辑您的问题,以显示不同的表格有一些独特的列,根据您的评论如下。 – 2009-02-18 17:28:22

回答

9

一个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,如果你想,当然)

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

如果是我,我只想做一个查询到每个表和选择N个最近的项目(按date_added desc limit N排序),然后将它们合并到PHP中。这样,如果您需要将这些表托管在单独的物理机器上,您将受到保护。

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

+0

+1表示建议1表 – 2009-02-18 17:15:00

+0

我的不好!我试图做一个简单的例子,但我做错了'因为我忘了说,照片表有4个属性(user_id,路径,photoname,日期),视频表有3个属性(user_id,youtube_video_url,日期)和评论有3(user_id,评论,日期)。所以我们有不同数目的表格 – AldoB 2009-02-18 17:20:41

+0

我该怎么做联盟?并在PHP中,我怎么能明白我表格提取行属于? – AldoB 2009-02-18 17:21:29

2

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

[编辑:事实证明,通过评论和问题编辑,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 
1

就个人而言,我会再拍表来存储的任何活动。它可以简化很多事情,并且还可以跟踪删除和其他活动。