使用n_m表选择内部联接

时间:2014-04-29 08:18:37

标签: mysql sql select

我有三张表如下:

USERS TABLE

id_user| name |
---------------
1      | ...
2      | ...

服务表

id_service | name |
-------------------
1          | ...
2          | ...
3          | ...

USER_SERVICES表(n-m)

id_user | id_service
--------------------
1       | 1
1       | 2
2       | 1

我需要从" SELECT * FROM users"开始进行SELECT。然后,通过服务获取用户。防爆。我需要让每个用户的服务= 1和服务= 2(也许他还有其他服务,但肯定是1和2)。

我做了以下事情:

SELECT * 
FROM  `users` 
INNER JOIN user_services ON users.id_user = user_services.id_user
WHERE id_service=1 AND id_service=2

但是,这当然不行,因为没有一条记录匹配service = 1和service = 2.

我该怎么办?

2 个答案:

答案 0 :(得分:1)

为您要检查的其他服务添加额外的联接: -

SELECT * 
FROM  `users` 
INNER JOIN user_services us1 ON users.id_user = us1.id_user AND us1.id_service=1
INNER JOIN user_services us2 ON users.id_user = us2.id_user AND us2.id_service=2

答案 1 :(得分:0)

select t.*,
       (select count(*) from user_services where id_user = t.id_user) how_much
  from users t;

这就是你想要的???

它显示了用户的数据以及服务表中的服务数量。其他可能性是:

select t.*,
       (case when (select count(*) 
                       from user_services where id_user = 1) > 0 
        then 'service1' 
        else 'null'
        end) has_service_1
  from users t;

这个选择的问题在于你必须重复这种情况...结束与你拥有的id_services一样多的时间,所以如果服务的数量随着时间的推移而增加则没有意义。相反,如果它是一个有点固定的数字,并且它不是一个大数字,这可能是一个解决方案。