1

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

我的桌子是:

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

3 回答 3

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;
于 2013-08-02T01:22:28.070 回答
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 应该编译成同样的东西,但是如果你开始添加更多而不是两个类别,它会更容易阅读。

于 2013-08-02T00:05:57.307 回答
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)来保存必须匹配的类别列表,则无需修改即可使用它。后一种查询比较简单,但是当类别发生变化时必须重写。

于 2013-08-02T06:24:46.443 回答