mysql 查找表中的独占记录

d4so4syb  于 2023-08-02  发布在  Mysql
关注(0)|答案(3)|浏览(118)

我是SQL的初学者。我有一个名为enrollment的表,其中有用户(user_id),他们可以拥有一个或多个课程,这些课程使用course_id表示。
我想找到只注册课程10的用户,没有到期费用(due_fee),没有其他任何费用。这是我在这个问题上的尝试,但它不起作用:
第一个月
这个查询选择course_id为10的用户,但是我如何过滤它,以便删除同时具有10和其他course_id的用户?那么最终结果将仅是course_id为10的用户。

sgtfey8w

sgtfey8w1#

你可以使用exists逻辑来表达这一点:

SELECT user_id
FROM student_enrollment se1
WHERE course_id = 10 AND due_fee = 0 AND
      NOT EXISTS (
          SELECT 1
          FROM student_enrollment se2
          WHERE se2.user_id = se1.user_id AND
                se2.course_id <> 10
      );

字符串
另一种方法,使用聚合:

SELECT user_id
FROM student_enrollment
WHERE due_fee = 0
GROUP BY user_id
HAVING SUM(course_id <> 10) = 0;

7cjasjjr

7cjasjjr2#

一个简单的方法是使用EXCEPT:查找所有参加课程#10的用户,除了那些还参加另一个课程的用户。

SELECT user_id FROM student_enrollment WHERE course_id = 10 and due_fee = 0
EXCEPT
SELECT user_id FROM student_enrollment WHERE course_id <> 10

字符串
https://dev.mysql.com/doc/refman/8.0/en/except.html

gev0vcfq

gev0vcfq3#

使用条件聚合和筛选:

SELECT user_id
FROM
(
SELECT user_id, 
       count(case when course_id = 10 then 1 else 0 end) cnt_10,
       count(case when course_id <> 10 then 1 else 0 end) cnt_other
  FROM student_enrollment s
 GROUP BY user_id
) s
WHERE cnt_10>0 and cnt_other=0

字符串

SELECT user_id
  FROM student_enrollment s
 GROUP BY user_id
HAVING count(case when course_id = 10 then 1 else 0 end)>0
   AND count(case when course_id <> 10 then 1 else 0 end)=0

相关问题