从多对多关系中获取特定值

时间:2016-06-27 10:39:35

标签: mysql

我的数据库看起来像这样,我有分配给特定配置文件的客户帐户,我有分配给特定类别的配置文件,如此模式中所示:

| categories  |    | profiles  |    | categories_map           |
---------------    -------------    ----------------------------
| ID | name   |    | ID | name |    | ID | profile_id | cat_id |
---------------    -------------    ----------------------------
| 1  | cat1   |    | 1  | p1   |    | 1  |   1        |   1    |
| 2  | cat2   |    | 2  | p2   |    | 2  |   2        |   1    |
| 3  | cat3   |    | 3  | p3   |    | 3  |   3        |   1    |
                   | 4  | p4   |    | 4  |   1        |   2    |
                                    | 5  |   3        |   2    |
                                    | 6  |   4        |   3    |


| profiles_map              |
-----------------------------
| ID | profile_id | acc_id  |
-----------------------------
| 1  |  1         |  1      |
| 2  |  3         |  1      |
| 3  |  4         |  1      |

我需要将类别分配给帐户 - 这意味着当我想获取acc_id = 1的类别时,我应该获得ID为2和3的类别(ID为2的类别不适合,因为它包含ID 2未分配给此帐户)。我尝试了这个查询,但它没有工作

select cats.id from profiles_map map 
right join categories_map catm on catm.profile_id = map.profile_id 
right join categories cats on cats.id = catm.cat_id 
where catm.profile_id in (select profile_id from profiles_map where acc_id = 1) 
and map.acc_id = 1 group by cats.id;

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

你能尝试一下这个吗?

SELECT DISTINCT C.ID
    FROM profiles_map PM
    INNER JOIN categories_map CM ON CM.profile_id = PM.profile_id
    INNER JOIN categories C ON C.ID = CM.cat_id
    WHERE PM.acc_id= 1

答案 1 :(得分:0)

如果您只想获得类别ID,请尝试以下查询:

SELECT DISTINCT cm.cat_id FROM categories_map cm 
    WHERE cm.profile_id in 
    (SELECT profile_id FROM profiles_map WHERE acc_id = 1)

或者如果想要获取类别名称和ID,请使用以下查询:

SELECT cat.id,cat.name FROM categories cm 
    WHERE cat.id in (SELECT DISTINCT cm.cat_id FROM categories_map cm 
    WHERE cm.profile_id in 
    (SELECT pm.profile_id FROM profiles_map pm WHERE pm.acc_id = 1))