使用户处于1对n的关系中,其中条件在n表中

qqrboqgw  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(319)

我希望标题不要太混乱。我有以下1对n的关系。
用户

+---------------+------------------+
| Field         | Type             |
+---------------+------------------+
| id            | int(11) unsigned |
| title_id      | int(11) unsigned |
| firstname     | varchar(255)     |
| lastname      | varchar(255)     |
+---------------+------------------+

用户课程

+------------+------------------+
| Field      | Type             |
+------------+------------------+
| id         | int(11) unsigned |
| user_id    | int(11)          |
| course_id  | int(11)          |
+------------+------------------+

一个用户可以有多个课程。假设我想得到所有用户,其中用户有课程1、2和3。这在一个查询中是可能的吗?
提前谢谢。

pjngdqdw

pjngdqdw1#

我会用一个 WHERE IN 子句来获取课程列表后面的所有用户。

SELECT users.*
FROM users
JOIN user_courses
    ON user_courses.user_id = users.id
WHERE user_courses.course_id IN (1, 2, 3)             --At this point we have the list of users following courses 1, 2 OR 3
GROUP BY users.id
    HAVING COUNT(DISTINCT user_courses.course_id) = 3 --To filter the result for the users following 3 courses from the 1, 2, 3 selected above

sqlfiddle公司

baubqpgj

baubqpgj2#

使用 JOINWHERE 让所有的用户都了解他们的课程。然后,将组\u concat与 GROUP BY 以逗号分隔的值获取用户的所有课程。
最后,利用find\ in\ u set函数,检查逗号分隔的课程中是否有1、2和3。
案例1:如果您想找到所有这些用户,其中至少选择了课程id 1、2和3,那么使用 FIND_IN_SET 具体如下:

SELECT u.*, 
       GROUP_CONCAT(DISTINCT uc.course_id) AS courses 
FROM users AS u 
JOIN user_courses AS uc ON uc.user_id = u.id 
GROUP BY u.id 
HAVING FIND_IN_SET('1', courses) > 0 
  AND FIND_IN_SET('2', courses) > 0
  AND FIND_IN_SET('3', courses) > 0

案例2:如果要查找仅选择课程id 1、2和3的所有用户,请使用以下选项:

SELECT u.*, 
       GROUP_CONCAT(DISTINCT uc.course_id ORDER BY uc.course_id ASC) AS courses 
FROM users AS u 
JOIN user_courses AS uc ON uc.user_id = u.id 
GROUP BY u.id 
HAVING courses = '1,2,3'

相关问题