ITPub博客

首页 > 数据库 > MySQL > 指定分组内的等级位置

指定分组内的等级位置

原创 MySQL 作者:壹頁書 时间:2017-03-13 18:41:11 0 删除 编辑

  1. CREATE TABLE `sod_song_artist_relation` (
  2.   `SongID` int(11) NOT NULL COMMENT '歌曲编号',
  3.   `ArtistID` int(11) NOT NULL COMMENT '艺术家ID',
  4.   `State` smallint(6) NOT NULL DEFAULT '1' COMMENT '状态 1有效 0 无效 ',
  5.   `CreateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '发布时间',
  6.   `Priority` smallint(6) DEFAULT '1000' COMMENT '推荐优先级',
  7.   PRIMARY KEY (`SongID`,`ArtistID`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4



  1. INSERT INTO `sod_song_artist_relation` (`SongID`,`ArtistID`,`State`,`CreateTime`,`Priority`) VALUES (12050,2,1,'2017-03-13 18:06:46',2);  
  2. INSERT INTO `sod_song_artist_relation` (`SongID`,`ArtistID`,`State`,`CreateTime`,`Priority`) VALUES (113949,2,1,'2017-03-13 18:06:46',3);  
  3. INSERT INTO `sod_song_artist_relation` (`SongID`,`ArtistID`,`State`,`CreateTime`,`Priority`) VALUES (115773,2,1,'2017-03-13 18:06:46',4);  
  4. INSERT INTO `sod_song_artist_relation` (`SongID`,`ArtistID`,`State`,`CreateTime`,`Priority`) VALUES (115774,2,1,'2017-03-13 18:06:46',5);  
  5. INSERT INTO `sod_song_artist_relation` (`SongID`,`ArtistID`,`State`,`CreateTime`,`Priority`) VALUES (116236,2,1,'2017-03-13 18:06:46',7);  
  6. INSERT INTO `sod_song_artist_relation` (`SongID`,`ArtistID`,`State`,`CreateTime`,`Priority`) VALUES (116733,2,1,'2017-03-13 18:06:46',8);  
  7. INSERT INTO `sod_song_artist_relation` (`SongID`,`ArtistID`,`State`,`CreateTime`,`Priority`) VALUES (117664,2,1,'2017-03-13 18:06:46',9);  
  8. INSERT INTO `sod_song_artist_relation` (`SongID`,`ArtistID`,`State`,`CreateTime`,`Priority`) VALUES (70017258,2,1,'2017-03-13 18:23:55',10);  
  9. INSERT INTO `sod_song_artist_relation` (`SongID`,`ArtistID`,`State`,`CreateTime`,`Priority`) VALUES (70024956,2,1,'2017-03-13 18:23:55',10);  

以上是实验数据准备





ArtistId是歌手的ID
Songid是歌曲ID

Priority是某个歌手的歌曲优先级,由编辑手工调整。同一个歌手的歌曲优先级不一定是连续的.优先级越小越靠前显示,最大为10。


现在的问题是,编辑指定一个优先级,但是很有可能该优先级已经存在.比如上述数据,假设编辑要指定 编号 70024956 的歌曲优先级为 3,但是优先级已经存在.
那么会造成优先级重复,并且不能保证编号70024956 的歌曲优先于编号113949 的歌曲显示.

假设要将歌手为2的70024956 歌曲,由优先级10调整为5
我先将优先级大于等于5,并且小于10的歌曲,将优先级顺延,然后再将目标歌曲修改优先级.

  1. -- 模拟编辑调整歌手ID为2的歌曲70024956,把优先级由10改为5  
  2. SET @priority:=5;  
  3. SET @songid=70024956 ;  
  4. set @artistid=2;  
  5.   
  6. UPDATE sod_song_artist_relation target,  
  7.     (SELECT   
  8.         songid, artistid, @rank:=@rank + 1 AS rank  
  9.     FROM  
  10.         sod_song_artist_relation, (SELECT @rank:=@priority) vars  
  11.     WHERE  
  12.         artistid = @artistid AND state = 1  
  13.             AND priority < 10  
  14.             AND priority >= @priority  
  15.             AND songid != @songid  
  16.     ORDER BY priority) source   
  17. SET   
  18.     target.priority = CASE  
  19.         WHEN source.rank >= 10 THEN 10  
  20.         ELSE source.rank  
  21.     END  
  22. WHERE  
  23.     source.songid = target.songid  
  24.         AND source.artistid = target.ArtistID;  
  25.   
  26. UPDATE sod_song_artist_relation   
  27. SET   
  28.     priority = @priority  
  29. WHERE  
  30.     songid = @songid and artistid = @artistid;  

修改之后,查看结果,自给定优先级之后的数据,均有序且连续



而给定优先级之前的数据,可能并不连续.

如果需要设置的是名次
可以先将该歌手优先级小于10的数据重排序,让priprity连续有序,在执行上述SQL即可。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-2135260/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339963