MySQL从三个表中过滤行

标签 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 类别 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/

相关文章:

Mysql查询在不同表中搜索同一列

php - 不同的排名逻辑

mysql - Laravel 5 自动生成表单编号/标识符

mysql - 将 mysql 查询拆分为两个以避免 join -> sum ids 并使用 where in

MySQL - SELECT 查询 - 最旧和最年轻的日期

mysql - 在 MySQL 中将文本转换为数字以允许算术运算符

mysql - 查询两个表,其中一行与另一行相似

mysql - 连接 2 个 MySQL 临时表比连接临时表和普通表并添加 WHERE 子句慢 50 倍?

python - 如何在没有 key 的情况下执行 SQL 外连接的 pandas 等价

php - 需要一个检查单元格的 mysql case 语句