选择与列中的一个项匹配的记录

时间:2014-05-02 20:37:36

标签: asp.net sql sql-server

所以我正在制作一个电影网站,在我的数据库表中,我有一个名为Genre的专栏。在这里我列出了这样的类型;恐怖,行动。

示例表

+----+---------+--------+
| id | Genre            |
+----+---------+--------+
|  1 | Action           |
|  2 | Horror, Action   |
|  3 | Horror           |
|  4 | Action           |
|  5 | Romance, Drama   |
|  6 | Horror, Drama    |
+----+---------+--------+

因此,如果我要查询以获取具有恐怖类型的电影,它将返回ID为2,3& 6.我如何构建查询来执行此操作?

感谢。

2 个答案:

答案 0 :(得分:2)

数据库的结构不好。阅读database normalization以了解其原因。我会选择这样的结构:

Movie:
Id
Name

Movie_Genres
Movie_Id
Genre_Id

Genres:
Id
Name

然后您可以执行以下查询:

SELECT m.name 
FROM Movie as m
INNER JOIN Movie_Genres as mg
  ON mg.Movie_id = m.id
WHERE mg.Genre_id = {Horror genre Id}

如果你没有像这样构建你的数据库,你将会遇到很多问题。

答案 1 :(得分:1)

继续关注@Abe的优秀答案。如果你想基于@Abe的规范化3表结构构建逗号分隔的字符串,它将如下所示:

SELECT  m.Name, 
        STUFF(( SELECT  ', ' + g.Name 
                FROM Movie_Genres as mg
                INNER JOIN Genres AS g on mg.Genre_id = g.Id and mg.Movie_id = m.id
                FOR XML PATH('')
            ), 1, 2, '') 
FROM Movie AS m
GROUP BY m.Name, m.Id; 

这是Fiddle