【发布时间】:2014-10-02 19:59:16
【问题描述】:
假设我有一个 'users' 和 'courses' 表,并且这两个表通过 'user_courses' 表相关。这允许 1 个用户拥有许多课程等。
我的 users 表包含 100 万用户,我想:
- 选择特定年龄和性别的用户 和
- 选择他们与另一个给定用户共有的确切课程数
我的方法是选择性别和年龄与我正在寻找的用户相匹配的用户,这相当容易。
接下来我执行 LEFT JOIN 并使用子查询获取所有用户的数量以及与给定用户共同的课程数量。
问题是,在子查询中,我必须再次选择所有用户,并且在子查询中不重复gender = 'female' ANDbirth_year BETWEEN '1991' AND '1993',它会选择全部 100 万用户。
选择 你。 *,matching_courses_count 从 用户你 左连接 (选择 COUNT(course_id) AS matching_courses_count, uc.user_id 从 用户你 左加入 user_courses uc ON u.id = uc.user_id 在哪里 uc.course_id IN(选择 course_id 从 用户课程 在哪里 用户 ID = 1) AND uc.user_id != 1 GROUP BY uc.user_id) matching_courses ON u.id = matching_courses.user_id 在哪里 性别 = '女性' ANDbirth_year BETWEEN '1991' 和 '1993'SQL 小提琴:http://sqlfiddle.com/#!2/c36b8/3
有没有一种方法可以做到这一点,而不必在子查询中再次选择用户或不必在子查询中重复 where 子句?
【问题讨论】: