0

テーブル:

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 のみに制限することでした。これは機能します。ただし、そのようなクエリを実行するのに最適な方法であるかどうかはわかりません...このクエリをどのように実行することをお勧めしますか?

4

2 に答える 2

3

これは、クエリよりもはるかに効率的です。

SELECT distinct a.UserID
FROM   tUsers a LEFT JOIN tPrefVals b
         on a.UserID = b.UserID
WHERE  b.PrefID in ('20', '21') AND b.`Value` = 'es'
于 2012-05-23T04:57:58.007 に答える
0

tUsers テーブルを使用している理由がわかりません。しかし、これにより、あなたが探していると私が理解している結果が得られるはずです。

select distinct userid from tPrefVals
where value = 'es' and prefid in ('20', '21')
于 2012-05-23T04:55:32.820 に答える