2017-09-28 2 views
2

私は良い解決策を持っているため、少し問題があります。私はより良い結果を検索する必要があります。より良い結果の一致を選択

私は3つのテーブル、ルール、意味、およびrule_meaningを持っています。 1ルールは1つ以上の意味を持つことができます。

これは

SELECT * FROM rule, rule_meaning, meaning WHERE rule_meaning.rule_id = rule.id AND rule_meaning.meaning_id = meaning.i 

rule.id rule.name rule.id meaning_id meaning.id meaning.name 
1 RADIO - Ecouter 1  1   1   ACTIVER 
1 RADIO - Ecouter 1  6   6   RADIO 
2 LUMIERE Allumer 2  1   1   ACTIVER 
3 RADIO + volume 3  6   6   RADIO 
4 RADIO - volume 4  6   6   RADIO 

私はACTIVERとRADIOを検索する場合、私は唯一のRADIOを持つようにしたいための結果である - 私は

  • を試してみましたEcouter(rule.id = 1)

    WHERE meaning.name = ACTIVER、meaning.name = RADIOだが結果はない

  • WHERE meaning.name = ACTIVER OR meaning.name = RADIO私はいくつかの結果を持っています。

+0

どのようなエラーが表示されますか?何が問題なのですか?... 'meaning.name = ACTIVERとmeaning.name = RADIO'は意味がありません...どのようにして2つの値を同時に持つことができますか –

+0

あなたのスキーマと期待される結果を、テキスト(画像ではない) – zarruq

+0

実際には、この2つの単語ACTIVERとRADIO simultanelyに一致する結果のみを選択したいと思います。だから私は結果がrule.id 1でなければならないと言ったのです – eldiablo62

答えて

0

あなたはcase文の例

CASE WHEN WHERE meaning.name = ACTIVER AND meaning.name = RADIO 
    THEN .... 
    ELSE 

を使用することもできますが、私はあなたが求めているものだと思うが

WHERE meaning.name = ACTIVER AND rule.name = RADIO 
    AND rule.id = 1 
2

であるあなたはACTIVER両方の意味を持つルールを選択したいと無線。あなたは凝集にこれを行うことができます:

select * 
from rule 
where id in 
(
    select rule_id 
    from rule_meaning 
    where meaning_id in (select id from meaning where name in ('ACTIVER', 'RADIO')) 
    group by rule_id 
    having count(*) = 2 -- both meanings 
); 

私はあまり好きでは別のアプローチは、EXISTSまたはINで個別にそれぞれの値を調べることであろう。私はそれをここに示しています。なぜなら、それはその課題に近づける簡単な方法だからです。

select * 
from rule 
where id in 
(
    select rule_id 
    from rule_meaning 
    where meaning_id = (select id from meaning where name = 'ACTIVER') 
) 
and id in 
(
    select rule_id 
    from rule_meaning 
    where meaning_id = (select id from meaning where name = 'RADIO') 
); 
関連する問題