2014-02-23 33 views
1

比方说,我有了这个数据库:选择从一个表,但是过滤另外两个

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它工作宽度或但结果不是我所需要的。我也尝试使用连接,但我无法获得我期望的结果。
这里是我当前项目的SQLFiddle,使用我当前的数据库,开始时的数据只是一个示例。 SQLFiddle
任何帮助将非常感激。使用

+0

...我有点担心'DATA'列。你打算在那里做什么? –

回答

2

解存在:

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 
+0

我认为这正是我需要的伙伴!现在测试它.. –

+0

两种方法都按预期工作。考虑到我应该使用连接来使用结构,我会匹配两个以上的类别? –

+0

@LCH对于你的情况可能是最简单的,如果它始终只是获取与N个类别关联的书籍,而其他变量不在播放 –

1

你可以尝试使用的ALL代替IN(如果你只想要符合所有条件的要值返回):

SELECT book.* 
FROM book, book_categ 
WHERE book_categ.idCateg = ALL(1 , 2) 
1

获取结果的一种方法t是做加盟到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是两类是让所有的1或2 idCateg值,然后GROUP行BY book_id并获得不同值的个性化......

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