2012-06-20 17 views
6

私は自分のサイトのプロファイルに「最近のアクティビティ」タブを作成しています。また、モデレータがサイト上で起こったことをすべて見るためのログを持っています。これには、何らかのアクティビティー・ログを作成する必要があります。アクティビティログを作成する最も効率的な方法

私はちょうど良いことが分かりません。

  1. 「アクティビティ」と呼ばれるテーブルを作成し、その後、毎回誰かが何かをする、アクションの種類とそれにレコードを追加し、ユーザID、タイムスタンプなど
    • 問題:私は2つのオプションを持っています:テーブルが非常に長くなる可能性があります。
  2. 3つのテーブル(質問、回答、answer_comments)にすべて参加して、アクションが実行された順番にページ上に何らかの形で表示します。
    • 問題:私はちょうど3つのテーブルを結合してを「ジョンはここで質問タイトルの答えにコメントし、」それはを言う作ることができるか見当もつかないので、これは非常に難しいだろう。

誰もがこのような状況でアクティビティログを作るのより良い方法を知っていますか?私はPHPとMySQLを使用しています。これがあまりにも非効率であるか難しい場合は、プロファイル上の[最近のアクティビティ]タブを忘れてしまいますが、引き続きモデレータのアクティビティログが必要です。

ここで私はオプション2のために作り始め、いくつかの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(適切なオプションのIMO - 適切にインデックスを作成している限り)は、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の文はそれぞれ同じ数の列を持つ必要があります。したがって、1つが短い場合は、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何らかの理由でコメント上に何かの理由でそれはタイトルのように質問IDを表示しているように見えますし、 //screencast.com/t/qvDzliDs9U私が知っていることのいくつかは '$ row ['SSlug ']'や(これはタイトルのURLスラッグですが)影響を受けてはいけません他のもの。 – Nathan

+0

連想キーの名前は**最初の** 'SELECT'から来ます。すべての共通列( 'id、created、q_id、q_title')を選択し、別々の列を最後に選択する必要があります(' a.ans_id'と 'ac.id')。これは欠陥ではない - 「UNION」は同じデータを選択するために設計されている。空白のタイトルについては、 'q_title'ではなく' qTitle'を使用しています。 – andrewtweber

1

私は「オプション2」が好きですが、基本的にはデータを複製することになり、余分な読み取り/書き込みで少し遅くなります。たぶん代わりに

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

を行うのあなたはどちらかだけの各テーブルから必要なデータを得ることができ、またはわずかにきれいな方法は、これらのポストにクエリを制限した後、3つのテーブルのUnionを行うことかもしれ選択されたユーザーによって、および投稿された日付順に並べ替えられます。

+0

これはアクションがある場合、私は検出することができたどのように良いアイデアのようにしかし、whileループ内を検索します答え、質問、またはコメント?もし私がそれを行うことができれば、これはうまくいくでしょうし、私は「{User}は質問のタイトルに答えました」と答えることができます。質問の場合は「{User}が質問タイトルを尋ねます」 – Nathan

+0

例えばselectステートメントのそれぞれに、それが何であるかの文字列をスローするタイプの変数を追加することができます:select from 'question' as activity_type、q.field1など... –

関連する問題