2

私は3つのテーブルを持っています:チャンピオン、ロール、ch​​amps_to_roles

champs_to_roles テーブルは次のようになります。

|ID_champ|ID_role|
 ----------------
|       2|      2|
|       4|      5|
|       5|      3|
|       3|      2|
|       1|      1|
|       1|      2|

ID_champ WHERE ID_role = 1 AND ID_role = 2 を選択しようとしています。

この時点で、次のコードがあります。

SELECT DISTINCT `c`.`name`
FROM `champions` AS c,
(
    SELECT `ID_champ`
    FROM `champs_to_roles`
    WHERE `ID_role` IN(1,2)
) AS r
WHERE `r`.`ID_champ` = `c`.`ID`

ただし、これは ID_role = 1 OR Id_role = 2 OR それらの両方で ID_champ を返します

必要なものを取得するにはどうすればよいですか?

どうもありがとう :)

4

4 に答える 4

4

関連テーブルへの 2 つの内部結合を使用します (役割の種類ごとに 1 つ)。

SELECT c.name
FROM champions c
JOIN champs_to_roles ctr1 ON ctr1.ID_champ = c.id AND ctr1.ID_role = 1
JOIN champs_to_roles ctr2 ON ctr2.ID_champ = c.id AND ctr2.ID_role = 2

内部結合を使用すると、チャンピオンが返されるために両方の行が存在する必要があります。champs_to_roles

DISTINCT キーワードは必要ないため省略されました (関連付けテーブルに重複するエントリがある場合を除きます。これは可能性が低く、設計が悪いと思われます)。

于 2013-07-08T08:45:21.317 に答える
0

次のようなものを試すことができます:

Select 
    c.name
from
    champions c
where
    exists( select 
            1
        from
            champs_to_roles ctr1
        where
            ctr1.ID_champ = c.ID
                and exists( select 
                    1
                from
                    champs_to_roles ctr2
                where
                    ctr2.ID_champ = ctr1.ID_champ
                        and ctr2.ID_role <> ctr1.ID_role))
于 2013-07-08T09:02:29.673 に答える