テーブル:
tUsers: userid (ユーザー情報を含む) tPrefs: prefid、prefname (設定定義を含む) tPrefVals: userid、prefid、値 (設定値を含む)
プリファレンスは必須ではないため、プリファレンス レコードは実際には存在しない場合があります。
設定テーブルは次のようになります。
id, userid, prefid, value
1, 1, 20, es
2, 1, 224, false
3, 1, 234, true
4, 2, 220, en
5, 2, 221, es
6, 2, 234, true
prefid は、設定定義のキーです。たとえば、第一言語、第二言語などの設定です。設定値テーブルには、tPrefs テーブルで定義された各設定に対応する行がある場合とない場合があります。わかる?
値はすべて tPrefVals テーブルに格納されます。そのテーブルには、複数の設定を持つユーザーごとに1行だけではなく、ユーザーごとに設定ごとに1つの行があります。
目標: 設定 20 または 21 の値が「es」に設定されているユーザーのリストを取得します。
SELECT DISTINCT tUsers.userid FROM tUsers
LEFT JOIN tPrefVals AS pri_lang ON tUsers.userid = pri_lang.user_id
LEFT JOIN tPrefVals AS sec_lang ON tUsers.userid = sec_lang.user_id
WHERE
((pri_lang.prefid = '20' AND pri_lang.value = 'es')
OR
(sec_lang.prefid = '21' AND sec_lang.value = 'es'))
私の考えでは、pref 値テーブルを 2 回結合したままにし、WHERE を使用してタイプ 20 または 21 の prefs のみに制限することでした。これは機能します。ただし、そのようなクエリを実行するのに最適な方法であるかどうかはわかりません...このクエリをどのように実行することをお勧めしますか?