Kullanıcı son faaliyetler - PHP MySql

5 Cevap php

Here's my problem: I have 3 MySql tables representing: photos a user post, videos a user post, comments a user post and I need to view the 10 (20, 30, 40...) most recent activities by the user. For example in photos table may be composed by:

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 

videoları tablo

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 tablo

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

Gördüğünüz gibi 3 tablo nitelikleri farklı sayıda, bu yüzden sendika nasıl yapabilirim? sorgu sonucu alınırken ve nasıl i tablo wich anlayabilirim aittir?

Yani kullanıcı profili sayfasında I TARİH DESC tarafından bu şekilde sipariş tabii onun son faaliyetleri göstermek isterim:

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

Herkes bana lütfen yardımcı olabilir misiniz?

5 Cevap

Bir MySQL BİRLİĞİ burada sorgu işe yarayabilir:

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

Sonra gibi bir sonuç kümesi ile rüzgar ediyorum

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

ve benzerleri. (Aslında tabii, user_id SELECT dışında isterseniz bırakabilirsiniz)

Neden ilk etapta ayrı tablo var? Muhtemelen veritabanı tasarımı bir hata.

[EDIT: o yorum ve soru düzenleme yoluyla dışarı çıktı, OP üç tabloları korumak için geçerli bir nedeni vardı. Kaldırıldı, bu konuda ayrıntılı bir tavsiye. ]

Sorununuzu çözmek için, BİRLİĞİ veya UNION ALL kullanabilirsiniz:

(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

Benim olsaydı, ben sadece her tabloya bir sorgu yapmak ve N en son öğeleri (DATE_ADDED azalan sınır N tarafindan) seçin ve ardından PHP bunları birleştirmek istiyorum. Hiç ayrı fiziksel makinelerde tablolar barındırması gereken durumda bu şekilde, korunur.

Eğer 3 tablolar neden ihtiyaç kendiniz de sorabilirsiniz. Belki bir activity_type sütun ile 1 masa yeterli olacaktır. Bu muhtemelen daha kolay daha sonra daha fazla aktivite türleri eklemek için yapmak istiyorum.

Şahsen ben herhangi bir faaliyeti depolamak için başka bir tablo yapmak istiyorum. Bu işler çok basitleştirmek olur ve ayrıca silme ve diğer faaliyetleri takip olabilir.