2014-02-23 66 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