2009-02-18 3 views
6

Ecco il mio problema: ho 3 tabelle MySql che rappresentano: foto un post utente, video un post utente, commenti un post utente e ho bisogno di visualizzare il 10 (20, 30, 40 ...) attività più recenti dell'utente. Per esempio nella foto tabella può essere composto da:Attività recenti dell'utente - 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 

tavolo 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 

tavolo commenti

 
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 

Come si può vedere i 3 tavoli hanno diverso numero di attributi , quindi, come posso fare l'unione? e mentre recupera il risultato della query, come posso capire a quale tabella appartiene?

Così nella pagina del profilo utente Mi piacerebbe mostrare le sue recenti attività, naturalmente, ordinati per data DESC questo modo:

 
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 

Qualcuno mi può aiutare per favore?

+0

Probabilmente dovresti modificare la domanda per mostrare che le diverse tabelle hanno alcune colonne univoche, come da commento qui sotto. –

risposta

9

interrogazione Un MySQL UNIONE potrebbe lavorare qui:

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

allora si sarebbe finire con un set di risultati come

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

e così via. (In realtà si può lasciare user_id fuori dalla selezionare se si desidera, ovviamente)

0

fare un UNION su queste tabelle:

(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

Se me è stato, vorrei solo fare una domanda ad ogni tavolo e seleziona gli elementi N più recenti (ordina per data_aggiunta il limite di risoluzione N), quindi uniscili in PHP. In questo modo, sei protetto nel caso tu abbia mai bisogno di ospitare le tabelle su macchine fisiche separate.

Potresti anche chiederti perché hai bisogno di 3 tavoli. Forse una tabella con una colonna activity_type sarebbe sufficiente. Ciò renderebbe probabilmente più semplice aggiungere più tipi di attività in seguito.

+0

+1 per suggerire 1 tavolo –

+0

mio male!Ho cercato di fare un semplice esempio, ma ho sbagliato, perché ho dimenticato di dire che la tabella delle foto ha 4 attributi (user_id, path, photoname, date), la tabella dei video ha 3 attributi (user_id, youtube_video_url, date) e commenti ha 3 (user_id, commento, data). Così abbiamo tabelle con diverso numero di attr – AldoB

+0

come posso fare l'UNION? e in php come faccio a capire di quale tabella si trova la riga che sto recuperando? – AldoB

2

Perché hai tabelle separate in primo luogo? Questo è probabilmente un errore nella progettazione del database.

[EDIT: Come risultava dai commenti e da una domanda di modifica, l'OP aveva un motivo valido per mantenere tre tabelle. Ulteriori consigli su questo rimosso.]

per risolvere il problema è possibile utilizzare UNION o 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

Ho fatto 3 tabelle diverse perché ogni elemento (foto, video, commento) ha attributi diversi – AldoB

+0

comunque, mentre recupera i risultati come posso capire a quale tabella appartiene? – AldoB

+1

È nella colonna pugno, come una stringa. – Tomalak

1

Personalmente, vorrei fare un'altra tabella per memorizzare qualsiasi attività. Semplificherebbe molto le cose e potreste anche tenere traccia delle cancellazioni e di altre attività.

+0

Dovresti esaminare l'intero contesto prima di votare le persone. La domanda è stata sostanzialmente modificata 7 minuti fa, e non ho guardato questo thread per almeno mezz'ora. Vai a capire. – Tomalak

+0

Posso rimuovere i voti dopo aver corretto la risposta. –

+0

Un commento che mi chiedesse di farlo sarebbe stato sufficiente. Sono piuttosto reattivo, come hai visto. – Tomalak