0

ユーザーによるすべてのアクティビティがログに記録されるMYSQLの「アクティビティ」テーブルがあります。ユーザーのアクティビティは、質問をすることも、質問に答えることもできるとしましょう。したがって、ユーザーが質問をすると、その質問は「質問」テーブルに入れられ、アクティビティも「アクティビティ」テーブルに入れられます。ユーザーが回答を提供した場合も同じですが、回答が「answers」テーブルと「activity」テーブルに入る点が異なります。

質問テーブルのフィールドは次のとおりです。

q_id          question

回答テーブルのフィールドは次のとおりです。

a_id          q_id        answer

アクティビティテーブルのフィールドは次のとおりです。

activity_id   q_id    user_id     action_type

(上に示したよりも多くの列がありますが、これらは要点を示しています。)

私ができるようにしたいのは、サイトでのユーザーの最近のアクションを表示し、実際にアクションが何であったかを表示することです。

私の現在のMYSQLクエリは、次のようにアクティビティテーブルと質問テーブルを単純に結合します(PDOを使用)。

"SELECT * 
FROM activity 
LEFT JOIN question ON activity.q_id = question.q_id 
WHERE activity.user_id = :user_id 
ORDER BY activity.a_id desc"  

これは問題なく機能し、アクティビティリストに表示するための質問をいつでも私に与えることができます。ただし、返されるアクティビティが回答の場合は、回答も表示できるようにしたいと思います。次のようにトリプル結合を使用してみました。

"SELECT * 
FROM activity 
LEFT JOIN question ON activity.q_id = question.q_id
LEFT JOIN answers ON activity.q_id = answers.q_id  
WHERE activity.user_id = :user_id 
ORDER BY activity.a_id desc"

ただし、これにより、最初のクエリの2倍の長さの行のリストが表示され、action_typeが回答の場合は回答が表示されません。

これは可能だと思いますが、考えれば考えるほど、アクティビティテーブルを破棄して、UNIONを使用して質問と回答のテーブルに対して直接クエリを実行する必要があると思います。この決定についての意見、および質問についての考えはありますか?

4

1 に答える 1

2

回答テーブルに対応する行がない場合でも、アクティビティテーブルのすべてを返す外部結合を使用できます。

SELECT *
FROM activity
LEFT JOIN question ON activity.q_id = question.q_id
LEFT OUTER JOIN answers ON activity.q_id = answers.q_id
WHERE activity.user_id = :user_id
ORDER BY activity.a_id desc

アクティビティテーブルのq_id値ごとに、質問テーブルに対応する行が常に1つあると想定しています。

重複する回答の問題を修正するには、アクティビティテーブルにa_idフィールドを追加します。質問アクティビティの場合はNULLに設定し、回答ごとにa_idフィールドを適切なa_id値に設定して、アクティビティに対応する回答を識別します。次に、上記のSQLを次のように調整します。

SELECT *
FROM activity
LEFT JOIN question ON 
    activity.q_id = question.q_id
LEFT OUTER JOIN answers ON 
    activity.q_id = answers.q_id AND 
    activity.a_id = answers.a_id
WHERE activity.user_id = :user_id
ORDER BY activity.a_id desc
于 2012-09-29T17:24:52.500 に答える