MySQL - 使用WHERE子句的内部联接

时间:2014-03-05 13:59:32

标签: mysql sql join

我在查找条件所在的记录时遇到问题。我想找到所有课程,其中有标志/标志。

课程表的记录:

+----+------+-----------------+
| id | code |      name       |
+----+------+-----------------+
| 1  | JPA  | JPA Lorem ipsum |
| 2  | JSF  | Jsf lorem ipsum |
+----+------+-----------------+

course_flags 表的记录:

+----+-----------+---------+
| id | course_id | flag_id |
+----+-----------+---------+
| 1  | 1         | 1       |
| 2  | 1         | 2       |
+----+-----------+---------+

我的第一个问题:(好)

 SELECT `course`.`id`, `course`.`name`  FROM `course` 
 INNER JOIN `course_flags`
 ON `course` .`id` = `course_flags`.`course_id`
 WHERE (`course_flags`.`flags_id` = 1)

数据库返回:

+----+-----------------+
| id |      name       |
+----+-----------------+
| 1  | JPA Lorem ipsum |
+----+-----------------+

我对两个条件的第二个查询:(不好?)

 SELECT `course`.`id`, `course`.`name`  FROM `course` 
 INNER JOIN `course_flags`
 ON `course` .`id` = `course_flags`.`course_id`
 WHERE (`course_flags`.`flags_id` = 1 and `course_flags`.`flags_id` = 2)

数据库返回:

null

我想收到:

+----+-----------------+
| id |      name       |
+----+-----------------+
| 1  | JPA Lorem ipsum |
+----+-----------------+

问我怎么得到它?

提前致谢!

2 个答案:

答案 0 :(得分:2)

SELECT c.id, c.name
FROM course AS c
INNER JOIN course_flags AS cf
ON c.id = cf.course_id
WHERE cf.flags_id = 1 
   OR cf.flags_id = 2

答案 1 :(得分:2)

我怀疑你想要所有提供所有旗帜的课程。

您可以通过向连接添加或条件然后按预期检查标记数来执行此操作:

SELECT `course`.`id`, `course`.`name`  FROM `course` 
INNER JOIN `course_flags`
     ON `course` .`id` = `course_flags`.`course_id` 
     AND (`course_flags`.`flags_id` = 1 OR `course_flags`.`flags_id` = 2)
WHERE 
GROUP BY (course.id)
HAVING COUNT(DISTINCT course_flags.id) = 2;