2009-02-18 39 views
6

Đây là vấn đề của tôi: Tôi có 3 bảng MySql đại diện: ảnh người dùng đăng, video người dùng đăng, nhận xét bài đăng của người dùng và tôi cần xem 10 (20, 30, 40 ...) các hoạt động gần đây nhất của người dùng. Ví dụ trong bảng ảnh có thể được sáng tác bởi:Hoạt động gần đây của người dùng - 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 

bảng video

 
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 

các ý kiến ​​bảng

 
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 

Như bạn có thể thấy 3 bảng có số khác nhau của các thuộc tính , vậy làm thế nào tôi có thể làm công đoàn? và trong khi tìm nạp kết quả truy vấn, làm thế nào tôi có thể hiểu được bảng thuộc về nó?

Vì vậy, trong trang hồ sơ của người sử dụng tôi muốn hiển thị các hoạt động gần đây của ông dĩ nhiên sắp xếp theo ngày DESC theo cách này:

 
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 

bất cứ ai có thể giúp tôi xin vui lòng?

+0

Bạn có lẽ nên chỉnh sửa câu hỏi của mình để cho thấy rằng các bảng khác nhau có một số cột duy nhất, theo nhận xét của bạn bên dưới. –

Trả lời

9

Một MySQL UNION truy vấn có thể làm việc ở đây:

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

Sau đó, bạn sẽ đối mặt với vấn về kết quả như

user_id | date_added | type 
    5 | 2009-01-03 | photo 
    5 | 2008-12-07 | video 
    5 | 2008-11-19 | comment 

và vân vân. (Trên thực tế bạn có thể để user_id ra khỏi SELECT nếu bạn muốn, tất nhiên)

0

Thực hiện UNION trên các bảng:

(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ếu là tôi, tôi sẽ chỉ làm một truy vấn để mỗi bảng và chọn N mục gần đây nhất (thứ tự theo date_added desc limit N), và sau đó hợp nhất chúng trong PHP. Bằng cách đó, bạn được bảo vệ trong trường hợp bạn cần lưu trữ các bảng trên các máy vật lý riêng biệt.

Bạn cũng có thể tự hỏi tại sao bạn cần 3 bảng. Có lẽ 1 bảng với cột activity_type là đủ. Điều đó có lẽ sẽ giúp bạn thêm các loại hoạt động dễ dàng hơn sau này.

+0

+1 để đề xuất 1 bảng –

+0

xấu của tôi!Tôi đã cố gắng làm một ví dụ đơn giản nhưng tôi đã làm sai rồi 'cos Tôi quên nói rằng bảng ảnh có 4 thuộc tính (user_id, path, photoname, date), bảng video có 3 thuộc tính (user_id, youtube_video_url, date) và ý kiến ​​có 3 (user_id, bình luận, ngày). Vì vậy, chúng tôi có bảng với số lượng attr khác nhau – AldoB

+0

làm thế nào tôi có thể làm UNION? và trong php làm thế nào tôi có thể hiểu được bảng mà hàng tôi đang tìm thuộc về? – AldoB

2

Tại sao bạn có bảng riêng ở nơi đầu tiên? Đó có thể là một sai lầm trong thiết kế cơ sở dữ liệu.

[EDIT: Khi được bật qua nhận xét và chỉnh sửa câu hỏi, OP có lý do hợp lệ để duy trì ba bảng. Lời khuyên thêm về việc này đã bị xóa.]

Để giải quyết vấn đề của bạn, bạn có thể sử dụng UNION hoặc 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 
+0

Tôi đã thực hiện 3 bảng khác nhau vì mỗi phần tử (ảnh, video, nhận xét) có các thuộc tính khác nhau – AldoB

+0

anyway, trong khi tìm nạp kết quả làm thế nào tôi có thể hiểu được bảng đó thuộc về? – AldoB

+1

Đó là trong cột nắm tay, như một chuỗi. – Tomalak

1

Cá nhân, tôi sẽ làm cho bảng khác để lưu trữ bất kỳ hoạt động. Nó sẽ đơn giản hóa mọi thứ rất nhiều và bạn cũng có thể theo dõi việc xóa và các hoạt động khác.

+0

Bạn nên xem xét toàn bộ bối cảnh trước khi bạn bỏ phiếu cho mọi người. Câu hỏi đã được chỉnh sửa đáng kể 7 phút trước, và tôi đã không xem chủ đề này trong ít nhất nửa giờ. Đi con số. – Tomalak

+0

Tôi có thể xóa phiếu bầu sau khi bạn sửa câu trả lời. –

+0

Nhận xét yêu cầu tôi làm như vậy là đủ. Tôi khá nhạy cảm, như bạn đã thấy. – Tomalak

Các vấn đề liên quan