2009-02-18 50 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

就個人而言,我會再拍表來存儲的任何活動。它可以簡化很多事情,並且還可以跟蹤刪除和其他活動。