2012-06-20 29 views
6

Tworzę zakładkę "ostatnia aktywność" dla profili w mojej witrynie, a także mam dziennik dla moderatorów, aby zobaczyć wszystko, co dzieje się na stronie. To wymagałoby stworzenia jakiegoś dziennika aktywności.Najbardziej skuteczny sposób tworzenia dziennika aktywności

Po prostu nie wiem, co byłoby lepsze. Mam 2 opcje:

  1. Złóż tabelę o nazwie „aktywność”, a następnie za każdym razem ktoś coś robi, dodać rekord do niego z rodzaju działań, ID użytkownika, datownik, itp
    • Problem : Stół może stać się bardzo długi.
  2. Dołącz do wszystkich 3 tabel (pytania, odpowiedzi, odpowiedzi), a następnie pokaż wszystkie na stronie w kolejności, w której zostały podjęte działania.
    • Problem: to byłoby bardzo trudne, ponieważ nie mam pojęcia w jaki sposób mogę zrobić to powiedzieć „Jan skomentował odpowiedź na pytanie tytule Here” tylko przez łączenie 3 tabel.

Czy ktoś wie lepszego sposobu dokonywania dziennik aktywności w tej sytuacji? Używam PHP i MySQL. Jeśli jest to zbyt nieefektywne lub trudne, prawdopodobnie po prostu zapomnę o karcie Ostatnie działania w profilach, ale nadal potrzebuję dziennika aktywności dla moderatorów.

Oto niektóre SQL, że zacząłem robić dla opcji 2, ale to nie działa, ponieważ nie ma sposobu wykrywania, czy działanie jest komentarz, pytanie lub odpowiedzieć kiedy echo informacji w while pętli:

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 

Z góry dziękuję za pomoc!

Odpowiedz

1

Dlaczego masz q.user i q.userid?

Dla opcji 2 (lepsza opcja IMO - o ile poprawnie indeksowano), myślę, że UNION jest bardziej tym, czego szukasz. Coś takiego:

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 

'question'/'answer'/'comment' powie która została podjęta akcja. Możliwe problemy, na które możesz natrafić: bycie instrukcją UNION, każda instrukcja SELECT musi mieć taką samą liczbę kolumn, więc jeśli jest krótka, możesz po prostu dodać wartość NULL, np.:

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

Ponadto, jeśli jeden z created kolumn ma inną nazwę można po prostu alias

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

Niestety, drugi powinien być rzeczywiście 'a.userid' (to był literówka). W każdym razie wielkie dzięki! Spróbuję tego i jeśli to zadziała, przyjmę twoją odpowiedź: D Dziękuję za ten sposób identyfikacji, czy to jest komentarz, pytanie, czy odpowiedź, ponieważ nigdy nie wiedziałem, że możesz to zrobić. – Nathan

+0

To prawie działa :) Mam tylko mały problem z dołączeniem do tabeli pytań, aby uzyskać informacje o pytaniu, aby można było je połączyć i takie tam. Oto SQL i PHP: http://screencast.com/t/EJgdGkMPBB Z jakiegoś powodu w komentarzach wydaje się, że wyświetla się identyfikator pytania jako tytuł, a następnie w przypadku odpowiedzi w ogóle nie pokazuje tytułu: http: //screencast.com/t/qvDzliDs9U Jestem świadomy, że niektóre rzeczy nie są jeszcze takie jak '$ row ['qSlug']' i stuff (co jest odnośnikiem URL tytułu), ale to nie powinno mieć wpływu inne rzeczy. – Nathan

+0

Nazwa klucza asocjacyjnego pochodzi od ** first ** 'SELECT'. Powinieneś najpierw wybrać wszystkie wspólne kolumny ('id, created, q_id, q_title'), a następnie wybrać odrębne kolumny jako ostatnie (' a.ans_id' i 'ac.id'). To nie jest wada - "UNION" jest przeznaczony do wybierania tych samych danych. Jeśli chodzi o pusty tytuł, używasz 'qTitle' zamiast' q_title'. – andrewtweber

1

Podobają mi się "opcja 2", w zasadzie powielanie danych i spowolniłoby to trochę dzięki dodatkowym odczytom/zapisom. Może zamiast robi

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

Można było albo po prostu dane, które trzeba z każdej tabeli, lub nieco bardziej przejrzysty sposób może być zrobić Union z trzech stołów, po ograniczeniu zapytanie tylko do tych stanowisk przez wybranego użytkownika i zamówić według daty wysłania.

+0

To wygląda jak dobry pomysł, ale w pętli while, jak mogę wykryć, czy działanie jest odpowiedź, pytanie lub komentarz? Jeśli będę mógł to zrobić, to zadziała i mogę powiedzieć: "{Użytkownik} skomentował odpowiedź dotyczącą Tytułu Pytania", jeśli jest to komentarz, a następnie "{Użytkownik} zadał Tytułu Pytania", jeśli to jest pytanie, itp. – Nathan

+0

ty można dodać zmienną dla typu, na przykład w każdej z instrukcji select rzucić w łańcuchu na to, co to jest: wybierz "pytanie" jako typ aktywności, q.field1, etc od ... –

Powiązane problemy