MySQL过滤三个表中的行

时间:2014-02-23 01:16:30

标签: mysql join

假设我有这个数据库:

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
任何帮助都将非常感激。

1 个答案:

答案 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的数量来改变最后一个数字。