从一个表中选择,但过滤其他两个表

时间:2014-02-23 02:28:27

标签: mysql sql

假设我有这个数据库:

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

3 个答案:

答案 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