这是我的问题:我有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
有人可以帮我吗?
答案 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;