2011-01-10 8 views
0

Person、Character、PersonCharacterのクラスとそれに対応する構造が、次のデータ構造とMySQLデータベースのデータであるとします。可能であれば2つのテーブルのSQL AND/OR条件

table persons 
[ 
    { id: 1, name: peter }, 
    { id: 2, name: mary }, 
    { id: 3, name: joe }, 
    { id: 4, name: paul }, 
    { id: 5, name: may }, 
] 

table characters 
[ 
    { id: 101, description: cheerful }, 
    { id: 102, description: nervous }, 
    { id: 103, description: greedy }, 
    { id: 104, description: sincere }, 
    { id: 105, description: naive }, 
    { id: 106, description: firm }, 
] 

table person_characters 
[ 
    {id: 1000, person_id: 1, character_id: 101}, 
    {id: 1001, person_id: 1, character_id: 103}, 
    {id: 1002, person_id: 1, character_id: 106}, 
    {id: 1003, person_id: 2, character_id: 102}, 
    {id: 1004, person_id: 2, character_id: 104}, 
    {id: 1005, person_id: 3, character_id: 102}, 
    {id: 1006, person_id: 3, character_id: 105}, 
    {id: 1007, person_id: 4, character_id: 104}, 
    {id: 1008, person_id: 5, character_id: 101}, 
    {id: 1009, person_id: 5, character_id: 106}, 
] 

にはどうすれば、特定の文字を持っている者とすることを見つけることができる、レールの助けを借りて、SQL文を書くことができますか?たとえば、強くて明るい人物もいます。

質問は典型的なようですが、検索エンジンで答えを見つけるのは難しいです。

+0

あなたはすでに "文字" idまたはwouを知っていますかあなたはそれを見る必要がありますか? [本質的にはJOINクエリですが、まだ持っていない場合は、文字IDを相互参照するためにさらに深いレイヤーに移動する必要があります。] –

+0

これを調べる必要があります。 – OmniBus

+0

'PersonCharacter'は非常に意味のあるデータ要素名ではありません。 '人格 'はどうですか? – onedaywhen

答えて

0
SELECT persons.* 
FROM persons 
    JOIN person_characters 
    ON person_characters.person_id ON persons.id 
    AND 
     -- vvv Method one, we already have the character IDs: vvv 
     person_characters.character_id IN (101,106) 
     -- ^^^ /Method one ^^^ 

     -- vvv Method two, we need to look them up vvv 
     person_characters.character_id IN (
     SELECT characters.id 
     FROM characters 
     WHERE characters.description IN ('cheerful','firm') 
    ) 
     -- ^^^ /Method two ^^^ 

NOTE使用のみ1これらのステートメントの後に参加内部。あなたが行うかを探すための文字(複数可)のID(複数可)を持っていない場合、私はちょうど(アプローチのいずれかを示しています。特定の 文字を持っている

0

人?

ワンクエリまたは複数(例えば、「両方 『神経質』と 『しっかり』ある人物」)あたりの性格特性?

複数の場合は、relational divisionを使用して、テーブルに(「緊張」と「しっかり」)パラメータを置く。

関連する問題