假设我有这个数据库:
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 AND 类别2中的图书 这是我到目前为止所得到的:
SELECT book.* FROM book,book_categ
WHERE book_categ.idCateg = 1 AND book_categ.idCateg = 2
显然,这给出0结果因为每行只有一个idCateg
它的宽度为OR
,但结果不是我需要的。我也尝试过使用连接,但是我无法得到我期望的结果
这是我当前项目的SQLFiddle,开头的数据只是一个样本
SQLFiddle
任何帮助都将非常感激。
答案 0 :(得分:1)
您可以使用类别ID约束加倍连接:
SELECT a.* FROM book AS a
INNER JOIN book_categ AS b ON a.idBook = b.idBook AND b.idCateg = 1
INNER JOIN book_categ AS c ON a.idBook = c.idBook AND c.idCateg = 2
您可以使用子查询:
SELECT a.* FROM book AS a
WHERE
(SELECT COUNT(DISTINCT idCateg) FROM book_categ AS b
WHERE b.idBook = a.idBook AND b.idCateg IN (1,2)) = 2
如果您使用的是MySQL,那么您应该更喜欢连接变体,因为MySQL中的大多数连接都比子查询快得多。
这个也应该有效:
SELECT a.* FROM book a
INNER JOIN book_categ AS b ON a.idBook = b.idCateg
WHERE b.idCateg IN (5, 6)
GROUP BY idBook
HAVING COUNT(DISTINCT b.idCateg) = 2
并且应该比上面的两个更快,尽管你必须根据你请求的类别ID的数量来改变最后一个数字。