私はこのようなものを見ます:
questions
回答する質問のリストです。期待される回答のタイプ (例: からの検索、日付、数値、テキストなど)question_type
を示す列挙型です。入力されるデータのタイプは何でもかまいません。question_choices
これは、この表の他の列とともに、入力フォームを駆動できます。
question_answers
質問に対する定義済みの回答のリストが含まれています (宗教、髪の色、目の色などの定義済みのリストなど)。これを使用して、入力フォームに値のドロップダウン リストを作成できます。
users
かなり自明です。
user_characteristics
アンケートに対する私の回答のリストが含まれています。このweight
列は、私を探している誰かが同じ答えを持っていることが、私にとってどれほど重要かを示しています。question_choices_id
テーブルから作成された選択リストから回答が得られた場合、 が入力されますquestion_choices
。それ以外の場合question_choices_id
は NULL になります。value
列の場合は逆です。value
テーブルから構築された選択リストから回答が得られた場合、NULL になりますquestion_choices
。それ以外の場合value
は、質問に対するユーザーの手作りの回答が含まれます。
user_preferences
私が探している人のためのアンケートへの回答が含まれています。このweight
列は、探している人が同じ答えを持っていることが、私にとってどれほど重要かを示しています。question_choices_id
および列はvalue
、表と同じように動作しuser_characteristics
ます。
私の一致を見つけるためのSQLは次のようになります。
SELECT uc.id
,SUM(up.weight) AS my_weighted_score_of_them
,SUM(uc.weight) AS their_weighted_score_of_me
,SUM(up.weight) + SUM(uc.weight) AS combined_weighted_score
FROM user_preferences up
JOIN user_characteristics uc
ON uc.questions_id = up.questions_id
AND uc.question_choices_id = up.question_choices_id
AND uc.value = up.value
AND uc.users_id != up.users_id
WHERE up.users_id = me.id
GROUP BY uc.id
ORDER BY SUM(up.weight) + SUM(uc.weight) DESC
,SUM(up.weight) DESC
,SUM(uc.weight) DESC
パフォーマンス上の理由から、user_characteristics (id、question_id、question_choices_id、value、および user_id) のインデックスと user_preferences (id、question_id、question_choices_id、value、および user_id) のインデックスをお勧めします。
上記の SQL は、リクエストを行ったユーザーを除くすべてのユーザーに対して 1 つの行を返すことに注意してください。これは確かに望ましくありません。したがって、HAVING SUM(up.weight) + SUM(uc.weight) > :some_minimum_value
結果をさらにフィルタリングするために追加するか、他の方法を検討することができます。
さらなる微調整には、回答を私と同じかそれ以上に評価する人のみを返すことが含まれる可能性があります (つまり、彼らの特徴的な体重は>=私の体重の好みの体重です.