假设我有这个数据库:
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,它的工作宽度为OR,但结果不是我需要的。我也尝试过使用连接,但是我无法得到我期望的结果
这是我当前项目的SQLFiddle,对于我当前的数据库,开头的数据只是一个样本。 SQLFiddle
任何帮助都将非常感激。
答案 0 :(得分:2)
使用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
答案 1 :(得分:1)
您可以尝试使用ALL
代替IN
(如果您只想要返回符合所有条件的值):
SELECT book.*
FROM book, book_categ
WHERE book_categ.idCateg = ALL(1 , 2)
答案 2 :(得分:1)
获得结果的一种方法是两次加入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的所有行,然后使用GROUP BY book_id获取DISTINCT值的计数...
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