选择多个电影类别

时间:2013-08-02 00:02:16

标签: sql sqlite select

我的小电影数据库标签/类别查询有问题。

我的表是:

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');

3 个答案:

答案 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)来保存必须匹配的类别列表,则可以不经修改地使用它。后一个查询更简单,但必须在类别更改时重写。

相关问题