要求

2017-05-16 10 views
0

私は、ユースケースのこの種のための私のデータベースをstructurateことができる方法に関する質問をしました:要求

私は、各ユーザーが、私は予測していない(その後、することはできませんいくつかのメタデータを持っているユーザー&を持っています列に入れる)。例えば

:User1が実際に国= frとサイト=パリ User2が国= GBとサイト=ロンドンを持っていますが、またis_manager =真

を持って

、メタデータのカウントが、その後、変えることができ私はこの1つのようなスキーマを使用して考えていた:

enter image description here

しかし、私は、メタデータの国= Frと&サイト=パリでユーザーを抽出する方法が分かりません。

SELECT * 
FROM user_has_metadata UHM 
JOIN user U 
    ON UHM.user_id = U.id 
JOIN metadata M 
    ON UHM.metadata_id = M.id 
WHERE UHM.value = "Fr" OR UHM.value = "Paris" 

しかし、これは、私はそれ以降のデータを処理する必要があり、十分ではありません。 私が知っている唯一の方法は、要求をして、その後、私はSQLで行うことができないものを完了するためにはPythonを使用してpainfullです。より良い方法がありますか?

ありがとうございます。

+1

「それ以降のデータを処理する必要があります」とはどういう意味ですか?あなたの「プロセス」は何ですか?あなたが 'GROUP BY U.id'を望んでいると推測しているだけです。 – Peter

+0

サンプルテーブルのデータと期待される結果をすべて追加してください。 (画像はありません。) – jarlh

答えて

0

計画したスキーマは、あなたのニーズを満たすことができます。 SELECTは、次のようになります。

SELECT * 
FROM user U 
WHERE EXISTS 
(
    SELECT 1 
    FROM user_has_metadata UHM 
    WHERE 
     U.id=UHM.user_id 
     AND UHM.value = "Fr" 
) 
AND EXISTS 
(
    SELECT 1 
    FROM user_has_metadata UHM2 
    WHERE 
     U.id=UHM2.user_id 
     AND UHM2.value = "Paris" 
) 

ところで、私はテーブルUSERに「USER_ID」に「ID」を名前を変更することをお勧め、名前はフィールドが含まれているものを反映すべきである、とすべてのテーブルで同じと呼ばれるべきです。 metadata_idと同じです。 また、異なるメタデータタイプで同じである可能性があるため、「値」ではなく、metadata_id値を比較する方がよいでしょう。