2014-03-05 80 views
1

我有问题找到条件的记录在哪里。我想找到所有的课程,其中有旗帜/旗帜。MySQL - 内部连接与WHERE子句

记录为当然表:

+----+------+-----------------+ 
| 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 | 
+----+-----------------+ 

问题如何我懂吗?

在此先感谢!

回答

1

我怀疑你想要所有提供所有标志的课程。

您可以通过添加一个或条件标志的加入则检查数量做到这一点,你希望:

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; 
+0

没错!非常感谢你! – Piotr

+0

@Piotr没问题,很乐意帮忙。 – Jim

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