9 Stimmen

Aktuelle Aktivitäten der Benutzer - PHP MySQL

Ich habe 3 MySQL-Tabellen, die Folgendes darstellen: Fotos, die ein Benutzer postet, Videos, die ein Benutzer postet, Kommentare, die ein Benutzer postet, und ich muss die 10 (20, 30, 40 ...) neuesten Aktivitäten des Benutzers anzeigen.

Die Tabelle auf den Fotos kann zum Beispiel folgendermaßen aufgebaut sein:

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 

die Video-Tabelle

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

die Kommentartabelle

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

Wie Sie sehen können die 3 Tabellen haben unterschiedliche Anzahl von Attributen, so wie kann ich die Vereinigung zu tun? und beim Abrufen des Abfrageergebnisses wie kann ich verstehen, zu welcher Tabelle es gehört?

So in der Benutzerprofilseite möchte ich seine jüngsten Aktivitäten natürlich nach DATE DESC auf diese Weise geordnet anzeigen:

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

Kann mir bitte jemand helfen?

0 Stimmen

Wahrscheinlich sollten Sie Ihre Frage bearbeiten, um zu zeigen, dass die verschiedenen Tabellen einige eindeutige Spalten haben, wie in Ihrem Kommentar unten angegeben.

11voto

David Z Punkte 121773

Eine MySQL UNION-Abfrage könnte hier funktionieren:

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

Dann würden Sie eine Ergebnismenge erhalten wie

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

und so weiter. (Eigentlich können Sie die user_id aus dem SELECT, wenn Sie wollen, natürlich)

3voto

Tomalak Punkte 320467

Warum haben Sie überhaupt getrennte Tabellen? Das ist wahrscheinlich ein Fehler im Datenbankdesign.

[ EDIT : Wie sich durch Kommentare und die Bearbeitung einer Frage herausstellte, hatte der Auftraggeber einen triftigen Grund, drei Tabellen zu führen. Weitere Hinweise hierzu wurden entfernt. ]

Um Ihr Problem zu lösen, können Sie UNION oder UNION ALL verwenden:

(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

3voto

Joe Phillips Punkte 46741

Ich persönlich würde eine weitere Tabelle erstellen, um alle Aktivitäten zu speichern. Das würde die Dinge sehr vereinfachen und man könnte auch Löschungen und andere Aktivitäten verfolgen.

1voto

twk Punkte 15970

Wenn ich an Ihrer Stelle wäre, würde ich einfach eine Abfrage für jede Tabelle durchführen und die N neuesten Einträge auswählen (Reihenfolge nach Datum_hinzugefügt desc Limit N) und sie dann in PHP zusammenführen. Auf diese Weise sind Sie geschützt, falls Sie die Tabellen jemals auf verschiedenen physischen Rechnern hosten müssen.

Sie fragen sich vielleicht auch, warum Sie 3 Tabellen brauchen. Vielleicht würde 1 Tabelle mit einer activity_type-Spalte ausreichen. Das würde es wahrscheinlich einfacher machen, später weitere Aktivitätsarten hinzuzufügen.

0voto

Gumbo Punkte 617646

Machen Sie eine UNION auf diesen Tabellen:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X