我的小电影数据库标签/类别查询有问题。
我的表是:
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
编辑: 我家的数据库:
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');
答案 0 :(得分: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
中的每个条款都在测试是否存在一个类别。例如,如果您将问题更改为“不 Sci-Fi的动作影片”,那么您可以通过使第二个条件等于0来更改having
子句:< / p>
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 :(得分:1)
您可以使用OR子句,或者如果您有多个类别,则可能更容易使用IN
所以要么
SELECT Name FROM categorytable WHERE category ='Action' OR category ='Sci-Fi'
或使用IN
SELECT Name
FROM categorytable
WHERE category IN ('Action', 'Sci-Fi', 'SomeOtherCategory ')
使用IN应该编译为相同的东西,但是如果你开始添加更多而只是两个类别,它会更容易阅读。
答案 2 :(得分: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)来保存必须匹配的类别列表,则可以不经修改地使用它。后一个查询更简单,但必须在类别更改时重写。