6

私は自分のサイトのプロファイルに「最近のアクティビティ」タブを作成しています。また、モデレーターがサイトで発生したすべてを確認できるようにログを作成する予定です。これには、何らかのアクティビティ ログを作成する必要があります。

何が良いのかさっぱりわかりません。2 つのオプションがあります。

  1. 「アクティビティ」というテーブルを作成し、誰かが何かを行うたびに、アクションのタイプ、ユーザー ID、タイムスタンプなどを含むレコードをテーブルに追加します。
    • 問題:テーブルが非常に長くなる可能性があります。
  2. 3 つすべてのテーブル (質問、回答、answer_comments) を結合し、これらすべてをアクションが実行された順序でページに何らかの方法で表示します。
    • 問題: 3 つのテーブルを結合するだけで「John が Question Title Here の回答にコメントしました」と言う方法がわからないため、これは非常に困難です。

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

whileオプション 2 のために作成し始めた SQL を次に示しますが、ループで情報をエコーするときにアクションがコメント、質問、または回答であるかどうかを検出する方法がないため、これは機能しません。

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

助けてくれてありがとう!

4

2 に答える 2

1

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

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

各テーブルから必要なデータを取得するか、選択したユーザーによる投稿のみにクエリを制限し、投稿された日付で並べ替えた後、3 つのテーブルのユニオンを実行するのが少しクリーンな方法です。

于 2012-06-20T23:27:36.577 に答える
1

q.userとがあるのはなぜq.useridですか?

オプション 2 (より良いオプション IMO - 適切にインデックスを作成している限り) については、 a の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列の1つに別の名前が付いている場合は、別名にすることができます

SELECT 'comment', id, comment_date AS created FROM ac
于 2012-06-21T02:33:07.887 に答える