2012-06-03 60 views
0

我有这些表GenreSongs。他们之间显然有很多关系,因为一种流派可以(显然)有很多歌曲,一首歌曲可能属于很多流派(比如有一首歌曲xyz,它属于说唱音乐,它也可以属于嘻哈音乐)。我有这个表GenreSongs它充当了多对多关系图btw这两个,因为它包含GenreIDSongID列。所以,我应该这样做,在名为SongsCountGenre表中添加一列,其中将包含此类型的歌曲数量。我可以改变表中添加一列,还可以创建一个查询,这将使歌曲的数量,相关的查询来更新基于选择的表格

SELECT GenreID, Count(SongID) FROM GenreSongs GROUP BY GenreID 

现在,这给了我们什么,我们需要,每个流派的歌曲数量,但我怎么可以使用这个查询更新我制作的列(SongsCount)。一种方法是运行此查询并查看结果,然后手动更新该列,但我相信每个人都会同意这不是一种编程方式。 我认为我需要用子查询创建一个查询,它会从外部查询中获得GenreID的值,然后从内部查询(相关查询)中计算它的值,但我无法进行任何处理。任何人都可以帮助我做到这一点?

+0

不要忘记接受答案,如果它帮助你,作为对其他人的基本礼貌...... –

回答

0

的如何处理这个问题取决于你的数据的大小和频率它被更新。以下是一些场景。

如果您的歌曲频繁更新且表格很大,那么您可能希望在流派中包含一列,并使用歌曲表中的触发器更新列。

或者,您可以在流派的GenreSong表上建立一个索引。然后下面的查询:

select count(*) 
from GenreSong gs 
where genre = <whatever> 

应该运行得相当快。

如果您的歌曲不经常更新或批量更新(比如每晚或每周),则可以将歌曲计数更新为批次的一部分。您的查询可能类似于:

update Genre 
    set SongCnt = cnt 
    from (select Genre, count(*) as cnt from GenreCount gc group by Genre) gc 
    where Genre.genre = gc.Genre 

然而另一种可能是,你并不需要保存价值可言。您可以将它作为视图/查询的一部分,即时进行计算。

关系数据库非常灵活,并且通常有多种方法可以完成任务。正确的方法很大程度上取决于你想要完成什么。

+0

谢谢你,这是非常丰富。 – Razort4x

0

制作一个名为SongsCount的表格只是很糟糕的设计(冗余数据和更新开销)。相反,使用此查询单结果:

SELECT ID, ..., (SELECT Count(*) FROM GenreSongs WHERE GenreID = X) AS SongsCount FROM Genre WHERE ID = X 

这对于多个结果(更有效):

SELECT ID, ..., SongsCount FROM (SELECT GenreID, Count(*) AS SongsCount FROM GenreSongs GROUP BY GenreID) AS sub RIGHT JOIN Genre AS g ON sub.GenreID = g.ID