2

说我有以下表格

user_table 
id    username
1     abc
2     def
3     ghij

courses_table 
id    title
1     csc
2     math
3     syn

user_courses 
user_id    course_id
2           1
1           3
2           3

我想选择参加课程 1 和 3 的用户名,而不是至少 1 或 3,我的意思是 1 和 3

我尝试了以下 mysql 查询

SELECT DISTINCT  u.* FROM  user_table as u  LEFT JOIN user_courses as uc ON uc.user_id = u.id  WHERE uc.course_id = 1 AND uc.course_id=3;
SELECT DISTINCT  u.* FROM  user_table as u  LEFT JOIN user_courses as uc ON uc.user_id = u.id  WHERE uc.course_id IN (1,3);
SELECT DISTINCT  u.* FROM  user_table as u  LEFT JOIN user_courses as uc ON uc.user_id = u.id  WHERE uc.course_id IN (1,3) AND uc.user_id = u.id ;

执行的第一个和第三个查询没有显示结果,第二个查询显示所有至少有 course_id 1 或 3 的用户

如果您想知道为什么我使用 LEFT JOIN,这是因为我需要连接表的结果,而上面的代码行只是一个示例,我使用 LEFT 连接从大约 9 个表中获取数据。

请问有什么帮助吗?谢谢

SELECT DISTINCT  u.* FROM  user_table as u  LEFT JOIN user_courses as uc ON uc.user_id = u.id  WHERE uc.course_id IN( 1,3) AND uc.user_id = 2 ";

这显示了我想要的结果,它的输出“def”,但我不能使用 user_id 作为静态值(本例中的数字 2)

4

2 回答 2

5

这个问题叫做Relational Division

SELECT  a.id, a.username
FROM    user_table a
        INNER JOIN user_courses b
            ON a.id = b.user_ID
WHERE   b.course_ID IN (1,3)
GROUP   BY a.id, a.username
HAVING  COUNT(*) = 2

如果course_ID考虑到用户重修了课程,对于每个用户来说不是唯一的,DISTINCT则需要一个关键字来计算唯一的课程,

SELECT  a.id, a.username
FROM    user_table a
        INNER JOIN user_courses b
            ON a.id = b.user_ID
WHERE   b.course_ID IN (1,3)
GROUP   BY a.id, a.username
HAVING  COUNT(DISTINCT b.course_ID) = 2

输出

╔════╦══════════╗
║ ID ║ USERNAME ║
╠════╬══════════╣
║  2 ║ def      ║
╚════╩══════════╝
于 2013-03-13T07:34:23.983 回答
0

请试试这个:

SELECT 
  U.id,
  U.username
FROM
  user_courses UC 
  INNER JOIN user_table U 
    ON UC.`user_id` = U.`id` 
WHERE UC.`course_id` = 1 
  OR UC.`course_id` = 3 
  GROUP BY U.`id` 
  HAVING COUNT(*) > 1
于 2013-03-13T08:02:46.930 回答