微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Django中的子查询上使用GroupConcat

如何解决如何在Django中的子查询上使用GroupConcat

我有一个应用程序,可以在不同的Musicstation上存储播放的音乐。我的模型如下:

class PlaylistItem(models.Model):
    played_at = models.DateTimeField(_('played at'))
    station = models.ForeignKey(Station,on_delete=models.CASCADE)
    log_track = models.ForeignKey('LogTrack',on_delete=models.CASCADE)

class LogTrack(UpdateInfo):
    track = models.ForeignKey(Track,on_delete=models.CASCADE,blank=True,null=True)

class Track(UpdateInfo):
    artist = models.CharField(_('artist'),max_length=150)
    tracktitle = models.CharField(_('tracktitle'),max_length=150)

Track模型是由LogTrack歌曲的标准化名称组成的模型。

我想要的是在一段时间内不同电台(与主电台匹配)之间重叠的歌曲的概述。我想知道这首歌已经在不同的电台上播放了多少次,按主电台的顺序排列,以及在多少个电台上也按顺序(降序)播放了这首歌。 这个想法是:

我正在考虑这样的输出

Master Station    | Station B | Station C
-----------------------------------------
Track 1 (5 plays) | 8 plays   | 3 plays
Track 2 (2 plays) | No        | 5 plays
Track 3 (2 plays) | No        | No

或作为数据库输出

track_id | station__count | groupconcat(track,station,play_count)
-------------------------------------------------------------------
1        | 2              | (1,22,3),(1,29,5)
2        | 1              | (2,4)

MysqL中,我得到了这个查询(可能过于复杂):

select 
   playlist_logtrack.track_id,count(playlist_logtrack.track_id) as playcount,json_group_played_per_station from 
playlist_playlistitem p1
left join playlist_logtrack on p1.log_track_id = playlist_logtrack.id
left join (
   select 
      track_id,group_concat(json_played_per_station) as json_group_played_per_station,count(json_played_per_station) as station_count 
   from
      (select 
         track_id,concat('{"id":"',track_id,'","station":"',station_id,"play_count":"',count(log_track_id),'"}') as json_played_per_station 
       from playlist_playlistitem
       left join playlist_logtrack on playlist_playlistitem.log_track_id = playlist_logtrack.id
       where (played_at between '2020-10-14' and '2020-10-16') and station_id in (91,2)
       group by playlist_logtrack.track_id,station_id) as played_per_station
   group by track_id) as compare_with
on compare_with.track_id = playlist_logtrack.track_id
left join playlist_track on (playlist_logtrack.track_id = playlist_track.id)
where 
    p1.station_id = 2 and
    p1.played_at between '2020-10-14' and '2020-10-27'
group by playlist_logtrack.track_id;

我无法将其导入Django ORM。到目前为止,我有。但是当我在子查询中使用它时,我就迷失了。

PlaylistItem.objects.filter(
    played_at__gte=datetime(2020,11,2,10),station_id__in=[22,29]
).values('log_track__track_id','station_id').annotate(
    played_per_track_and_station=Concat(
        'log_track__track_id',Value('-'),'station_id',Count('played_at')
    )
).values('played_per_track_and_station')

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。