假设我有这个数据库:
book
| idBook | name |
|--------|----------|
| 1 |Book#1 |
category
| idCateg| category |
|--------|----------|
| 1 |Adventures|
| 2 |Science F.|
book_categ
| id | idBook | idCateg | DATA |
|--------|--------|----------|--------|
| 1 | 1 | 1 | (null) |
| 2 | 1 | 2 | (null) |
我尝试只选择类别 1 和类别 2 中的书籍,如下所示
SELECT book.* FROM book,book_categ
WHERE book_categ.idCateg = 1 AND book_categ.idCateg = 2
显然,这给出 0 个结果是因为每行只有一个 idCateg,它确实工作宽度或,但结果不是我需要的。我也尝试使用联接,但我无法获得我期望的结果。
这是我当前项目的 SQLFiddle,使用我当前的数据库,开头的数据只是一个示例。SQLFiddle
任何帮助将不胜感激。
使用 EXISTS 的解决方案:
select *
from book b
where exists (select 'x'
from book_categ x
where x.idbook = b.idbook
and x.idcateg = 1)
and exists (select 'x'
from book_categ x
where x.idbook = b.idbook
and x.idcateg = 2)
使用联接和内联视图的解决方案:
select *
from book b
join (select idbook
from book_categ
where idcateg in (1, 2)
group by idbook
having count(*) = 2) x
on b.idbook = x.idbook
您可以尝试使用 ALL
而不是 IN
(如果您只想返回与所有条件匹配的值):
SELECT book.*
FROM book, book_categ
WHERE book_categ.idCateg = ALL(1 , 2)
获得结果的一种方法是两次连接到book_categ表,如下所示
SELECT b.*
FROM book b
JOIN book_categ c1
ON c1.book_id = b.id
AND c1.idCateg = 1
JOIN book_categ c2
ON c2.book_id = b.id
AND c2.idCateg = 2
这假定(book_id, idCateg)
在book_categ
表中被约束为唯一。如果它不唯一,则此查询可以返回重复的行。 添加 GROUP BY 子句或 DISTINCT 关键字将消除任何生成的重复项。
还有其他几个查询可以生成相同的结果。
例如,查找两个类别中的book_id的另一种方法是获取 idCateg 值为 1 或 2 的所有行,然后按book_id分组并获取不同值的计数...
SELECT b.*
FROM book b
JOIN ( SELECT d.book_id
FROM book_categ d
WHERE d.idCateg IN (1,2)
GROUP BY d.book_id
HAVING COUNT(DISTINCT d.idCateg) = 2
) c
ON c.book_id = b.id