2013-08-02 70 views
0

我遇到了我的小型電影數據庫標記/類別查詢問題。選擇多個電影類別

我的表是:

ID(index),Name(film name),category 

一個電影可以有多個類別。

SELECT Name FROM categorytable WHERE category ='Action'; 

工作正常,但如果我想其他的標籤,我得到空光標:

SELECT Name FROM categorytable WHERE category ='Action' AND category ='Sci-Fi'; 

實例選擇:

1 Film001  Action 
2 Film001  Sci-Fi 
3 Film002  Action 

編輯: 我家databese:

ID|NAMEFILM|DESCRIPTION 

並且完整查詢:

SELECT DATABASEFILM.NAMEFILM , DATABASEFILM.DESCRIPTION , NAME from DATABASEFILM , CATEGORY where DATABASEFILM.NAMEFILM=NAME AND category=(SELECT NAME FROM CATEGORY WHERE category ='Action'); 
+1

你試過'OR'嗎? 'SELECT Name FROM categorytable WHERE category ='Action'OR category ='Sci-Fi''; – Jack

+1

'在哪裏類別IN('Action','科幻');' –

+0

當我使用OR查詢作品,但找到所有'動作'電影,但不一定'科幻'。 – Shu

回答

3

您的查詢不起作用的原因是因爲每一行只有一個類別。相反,你需要做聚合。我更喜歡做having條款中的條件,因爲這是一種常規方法。

SELECT Name 
FROM categorytable 
group by Name 
having sum(case when category ='Action' then 1 else 0 end) > 0 and 
     sum(case when category ='Sci-Fi' then 1 else 0 end) > 0; 

having中的每個子句都在測試是否存在一個類別。如果,例如,您更改的問題是「動作片是科幻」,那麼你就通過使第二個條件相等的改變having子句0:

having sum(case when category ='Action' then 1 else 0 end) > 0 and 
     sum(case when category ='Sci-Fi' then 1 else 0 end) = 0; 
+1

這是不對的。如果按類別分組,則每個分類最後一行。分組結果中的任何一行都不能匹配兩個不同的類別,因爲有助於結果行的行都具有相同的類別。我想你打算按姓名分組。 –

+0

@SteveKass。 。 。接得好。按照你的建議,這應該是「按名稱分組」。 –

1

可以使用或條款,或者如果你有多個類別,它可能會更容易在

因此,無論

SELECT Name FROM categorytable WHERE category ='Action' OR category ='Sci-Fi' 

或者使用IN

使用
SELECT Name 
FROM categorytable 
WHERE category IN ('Action', 'Sci-Fi', 'SomeOtherCategory ') 

使用IN應該編譯爲相同的東西,但如果你明星更容易閱讀不只是增加兩個類別。

+0

但是,如果我想要「行動」和「科幻」的示例電影不僅「行動」? – Shu

0
with mustAppear(category) as (
    select 'Action' 
    union all 
    select 'Sci-Fi' 
) 
    select Name -- select those film names for which 
    from categorytable as C1 
    where not exists (-- there is no category that must appear with that name 
    select M.category 
    from mustAppear as M 
    where not exists (-- that does not. 
     select * 
     from categorytable as C2 
     where C2.Name = C1.Name 
     and C2.category = M.category 
    ) 
) 

您還可以更直接的是這樣的:

select Name 
from categorytable 
where category = 'Sci-Fi' 
intersect 
select Name 
from categorytable 
where category = 'Action'; 

前查詢的好處是,你可以使用它沒有修改,如果你創建一個永久表(mustAppear,或者您可以使用一個表變量@mustAppear)至持有類別必須匹配的ry列表。後者的查詢比較簡單,但在類別更改時必須重寫。

+0

第一個查詢在SQLite中不起作用。 –

+0

對不起,我錯過了sqlite標記,但是如果您有一個名爲MustAppear的永久表,並且具有所需的類別,則不需要WITH子句,並且應該可以毫無困難地使用第一個查詢的正文。 –