2012-06-20 19 views
6

Sto creando una scheda "attività recenti" sui profili del mio sito e avrò anche un registro per i moderatori per vedere tutto ciò che accade sul sito. Ciò richiederebbe un registro delle attività di qualche tipo.Il modo più efficiente per creare un registro delle attività

Solo non so cosa sarebbe meglio. Ho 2 opzioni:

  1. fare una tabella denominata "attività" e poi ogni volta che qualcuno fa qualcosa, aggiungere un record ad esso con il tipo di azione, id utente, timestamp, ecc
    • Problema : La tabella potrebbe essere molto lunga.
  2. Unire tutte e 3 le tabelle (domande, risposte, answer_comments) e quindi in qualche modo mostrare tutti questi nella pagina nell'ordine in cui è stata eseguita l'azione.
    • Problema: questo sarebbe estremamente difficile perché non ho idea di come avrei potuto farle dire "John ha commentato una risposta su una domanda Title Here" semplicemente unendo 3 tavoli.

Qualcuno sa di un modo migliore di fare un registro delle attività in questa situazione? Sto usando PHP e MySQL. Se questo è troppo inefficiente o difficile probabilmente dimenticherò la scheda Attività recenti sui profili ma ho ancora bisogno di un registro delle attività per i moderatori.

Ecco alcuni SQL che ho iniziato a fare per l'opzione 2, ma questo non avrebbe funzionato perché non c'è modo di rilevare se l'azione è un commento, domanda, o rispondere quando mi associo le informazioni in un ciclo while:

SELECT q.*, a.*, ac.* 
    FROM questions q JOIN answers a ON a.questionid = q.qid 
     JOIN answer_comments ac ON c.answerid = a.ans_id 
WHERE q.user = $userid 
AND a.userid = $userid 
AND ac.userid = $userid 
    ORDER BY q.created DESC, a.created DESC, ac.created DESC 

Grazie in anticipo per qualsiasi aiuto!

risposta

1

Perché hai q.user e q.userid?

Per l'opzione 2 (l'opzione migliore IMO - finché hai indicizzato correttamente), penso che uno UNION è più quello che stai cercando. Qualcosa di simile a questo:

SELECT 'question' AS action, id, created 
    FROM questions WHERE userid = {$userid} 
    UNION 
SELECT 'answer' AS action, id, created 
    FROM answers WHERE userid = {$userid} 
    UNION 
SELECT 'comment' AS action, id, created 
    FROM answer_comments WHERE userid = {$userid} 
ORDER BY created DESC LIMIT 20 

Il 'question'/'answer'/'comment' ti dice che è stata presa l'azione. Possibili problemi che potresti incontrare: essendo uno UNION, ogni istruzione SELECT deve avere lo stesso numero di colonne, quindi se una è breve, puoi semplicemente aggiungere un NULL ad es.:

SELECT 'comment', id, created, NULL FROM ac 

Inoltre, se uno dei created colonne ha un nome diverso si può solo alias

SELECT 'comment', id, comment_date AS created FROM ac 
+0

Scusa, la seconda dovrebbe essere effettivamente 'a.userid' (che era un refuso). Comunque grazie mille! Proverò questo e se funziona, accetterò la tua risposta: D E grazie per questo modo di identificare se si tratta di un commento, una domanda o una risposta perché non avrei mai saputo che avresti potuto farlo. – Nathan

+0

Funziona molto :) Sto solo avendo un piccolo problema nel partecipare alla tabella delle domande per ottenere le informazioni sulle domande in modo che possano essere collegate e altre cose. Ecco SQL e PHP: http://screencast.com/t/EJgdGkMPBB Per qualche ragione sui commenti sembra così che mostri la domanda id come titolo e quindi per le risposte non mostri affatto il titolo: http: //screencast.com/t/qvDzliDs9U Sono consapevole che alcune cose non sono ancora come '$ row ['qSlug']' e roba (che è lo slug URL del titolo) ma che non dovrebbe influenzare l'altra roba. – Nathan

+0

Il nome della chiave associativa deriva dal ** primo ** 'SELECT'. Dovresti innanzitutto selezionare tutte le colonne comuni ('id, created, q_id, q_title'), quindi selezionare le ultime colonne distinte (' a.ans_id' e 'ac.id'). Questo non è un difetto: 'UNION' è progettato per selezionare gli stessi dati. Per quanto riguarda il titolo vuoto, stai usando 'qTitle' invece di' q_title'. – andrewtweber

1

Mi piace "opzione 2", in pratica si potrebbero duplicare i dati e rallenterebbe un po 'le cose con le letture/scritture aggiuntive. Forse, invece di fare un

SELECT q.*, a.*, ac.* 

Si potrebbe o solo ottenere i dati che è necessario da ogni tabella, o un modo un po 'più pulito potrebbe essere quello di fare un Union delle tre tavole, dopo aver limitato la query solo a quei messaggi da utente selezionato, e ordine dalla data di pubblicazione.

+0

Questo appare come una buona idea, ma in un ciclo while come ho potuto rilevare se l'azione è un risposta, domanda o commento? Se posso farlo, allora funzionerà e potrei dire: "{Utente} ha commentato una risposta sul titolo della domanda" se si tratta di un commento e poi "{Utente} ha chiesto al titolo della domanda" se è una domanda, ecc. – Nathan

+0

tu può aggiungere una variabile per tipo, per esempio in ciascuna delle istruzioni select lanciare una stringa per quello che è: selezionare 'question' come activity_type, q.field1, ecc da ... –

Problemi correlati