假设我有这个数据库:
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
任何帮助将不胜感激。
最佳答案
您可以对类别 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,正如您的 fiddle 所暗示的那样,您应该更喜欢连接变体,因为 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 的数量更改最后一个数字。
关于MySQL从三个表中过滤行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22079599/