2012-06-20 39 views
6

我正在爲我的網站上的配置文件製作一個「近期活動」選項卡,並且我還將有一個日誌讓審查人員查看網站上發生的所有事情。這需要製作某種活動日誌。製作活動日誌的最有效方法

我只是不知道會更好。我有兩個選擇:

  1. 建立一個叫做「活動」表,然後每次有人做一些其它事情,一個記錄添加到它的動作類型,用戶ID,時間戳等
    • 問題:表可能會變得很長。
  2. 加入所有3個表(問題,答案,answer_comments),然後按照操作順序在頁面上以某種方式顯示所有這些內容。
    • 問題:這將是非常困難的,因爲我不知道我怎麼會讓它說「約翰對問題標題下面的答案評論說:」由剛剛加盟3個表。

有誰知道在這種情況下進行的活動日誌的更好的辦法?我正在使用PHP和MySQL。如果這要麼效率太低或太低,我可能會忘記配置文件上的最近活動選項卡,但我仍然需要主持人的活動日誌。

下面是一些SQL,我開始做對於第二種情況,但是這是行不通的,因爲沒有檢測動作是否是評論,問題的方式,或回答時,我呼應信息的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 

在此先感謝您的幫助!

回答

1

爲什麼你有q.userq.userid

對於選項2(更好的選項國際海事組織 - 只要你已經索引正確),我認爲UNION更多的是你在找什麼。類似這樣的:

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'告訴你哪個操作已被採取。可能遇到的問題是:UNION,每個SELECT聲明必須具有相同的列數,因此如果其中一項較短,則可以只添加一個NULL。:

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

而且,如果created一列具有不同的名稱,你可以只是別名

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

對不起,第二個實際上應該是'a.userid'(這是一個錯字)。無論如何非常感謝!我會試試這個,如果它能起作用,我會接受你的答案:D並且感謝那種識別它是評論,問題還是答案的方式,因爲我從來不知道你可以這樣做。 – Nathan

+0

這非常有用:)我只是有一個小問題,加入問題表來獲取問題信息,以便它可以鏈接和東西。這裏是SQL和PHP:http://screencast.com/t/EJgdGkMPBB由於某些原因,在評論中它似乎很顯示問題標題作爲標題,然後爲答案它根本沒有顯示標題:http: //screencast.com/t/qvDzliDs9U我知道有些東西還沒有像'$ row ['qSlug']'和東西(這是標題的URL段落),但不應該影響其他的東西。 – Nathan

+0

關聯關鍵字的名稱來自** first **'SELECT'。您應該首先選擇所有常用列('id,created,q_id,q_title'),然後選擇最後的不同列('a.ans_id'和'ac.id')。這不是一個缺陷 - 'UNION'是爲選擇相同的數據而設計的。至於空白標題,您正在使用'qTitle'而不是'q_title'。 – andrewtweber

1

我喜歡「選項2」,你基本上會複製你的數據,它會減慢一些額外的讀/寫的東西。也許,而不是做一個

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

你既可以只讓你從每個表需要,或稍微更清潔的方式可能會做三個表的Union,限制查詢,只有那些職位後的數據由選定的用戶,並按發佈的日期排序。

+0

這看起來像一個好主意,但在一個while循環,我怎麼能檢測是否該動作是回答,問題或評論?如果我可以這樣做,那麼這將起作用,並且我可以說:「{用戶}對問題標題的回答發表了評論」,如果它是評論,然後是「{用戶}問題標題」,如果是問題等。 – Nathan

+0

您可以爲類型添加一個變量,例如在每個選擇語句中爲它引入一個字符串:select'question'as activity_type,q.field1等... –