Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在播放列表表中为播放列表选择最流行的曲目_Mysql_Sql - Fatal编程技术网

Mysql 在播放列表表中为播放列表选择最流行的曲目

Mysql 在播放列表表中为播放列表选择最流行的曲目,mysql,sql,Mysql,Sql,我正在创建一个汇总表,其中包含我的所有播放列表的统计信息以及以下字段: 播放名 LatestTrackAddDate 轨道数 TracksPlayedCount 艺术家人数 最流行歌曲 我可以通过以下查询获取除第一个字段外的所有字段的名称: SELECT p.playlist_name AS 'Playlist Name', MAX(plt.playlisttrack_adddate) 'Latest Track Add Date', COUNT(DISTINCT plt.p

我正在创建一个汇总表,其中包含我的所有播放列表的统计信息以及以下字段:

播放名
LatestTrackAddDate
轨道数
TracksPlayedCount
艺术家人数
最流行歌曲

我可以通过以下查询获取除第一个字段外的所有字段的名称:

SELECT p.playlist_name AS 'Playlist Name', 
    MAX(plt.playlisttrack_adddate) 'Latest Track Add Date', 
    COUNT(DISTINCT plt.playlist_id, plt.track_id, plt.user_id, plt.playlisttrack_adddate) As 'Number of Tracks', 
    COUNT(DISTINCT pt.user_id, pt.track_id, playedtrack_datetime) As 'Number of Tracks Played',
    COUNT(DISTINCT a.artist_id) As 'Number of Unique Artists'
FROM playlist p
    JOIN playlisttrack plt ON p.playlist_id = plt.playlist_id
    JOIN tracksource ts ON ts.tracksource_typeid = p.playlist_id
    JOIN playedtrack pt ON pt.tracksource_id = ts.tracksource_id
    JOIN track t ON plt.track_id = t.track_id
        AND pt.track_id = t.track_id
    JOIN trackartist ta ON t.track_id = ta.track_id
    JOIN artist a ON ta.artist_id = a.artist_id
GROUP BY p.playlist_name;
我可以通过以下方式获得其自己查询中的最后一个字段:

SELECT playlist_name, track_name, MAX(count_plays)
FROM(
    SELECT p.playlist_name AS playlist_name, 
        t.track_name AS track_name,
        COUNT(pt.playedtrack_datetime)  AS count_plays
    FROM playlist p
        JOIN playlisttrack plt ON p.playlist_id = plt.playlist_id
        JOIN tracksource ts ON ts.tracksource_typeid = p.playlist_id
        JOIN playedtrack pt ON pt.tracksource_id = ts.tracksource_id
        JOIN track t ON plt.track_id = t.track_id
            AND pt.track_id = t.track_id
        JOIN trackartist ta ON t.track_id = ta.track_id
        JOIN artist a ON ta.artist_id = a.artist_id
    GROUP BY p.playlist_name, t.track_name) combined
GROUP BY playlist_name;
我不太确定如何结合这两个结果-任何指导都是感激的!谢谢大家!

编辑: 如果有多个曲目具有最大播放次数,则它们都将显示在表中

这些查询中使用的表的结构(省略其他表): 请再试一次-

SELECT nameOfPlaylist AS "Playlist Name",
       dateTrackLastAdded AS "Latest Track Add Date",
       trackCount AS "Number Of Tracks",
       numberOfTracksPlayed AS "Number Of Tracks Played",
       uniqueArtistCount AS "Number Of Unique Artists",
       playedTrackID AS "Most Popular Song(s)"
FROM
(
    SELECT playlist.playlist_id AS playlist_id,
           playlist.playlist_name AS nameOfPlaylist,
           MAX( playlisttrack.playlisttrack_adddate ) AS dateTrackLastAdded, 
           COUNT( playlisttrack.track_id ) AS trackCount,
           COUNT( DISTINCT playedtrack.track_id ) AS numberOfTracksPlayed,
           COUNT( DISTINCT trackartist.artist_id ) AS uniqueArtistCount,
           playedtrack.track_id AS playedTrackID,
           COUNT( playedtrack.track_id ) AS distributedTrackPlayCount
    FROM playlist
    JOIN playlisttrack ON playlist.playlist_id = playlisttrack.playlist_id
    JOIN tracksource ON tracksource.tracksource_typeid = playlist.playlist_id
    JOIN playedtrack ON playedtrack.tracksource_id = tracksource.tracksource_id
    JOIN track ON playlisttrack.track_id = track.track_id AND playedTrackID = track.track_id
    JOIN trackartist ON track.track_id = trackartist.track_id
    GROUP BY playlist.playlist_name,
             playedTrackID
) withDistributedTrackPlayCount
JOIN
(
    SELECT withConsolidatedTrackCount.playlist_id,
           MAX( consolidatedTrackPlayCount ) AS maxPlayCount
    FROM
    (
        SELECT withDistributedTrackPlayCount.playlist_id AS playlist_id,
               withDistributedTrackPlayCount.playedTrackID AS playedTrackID,
               SUM( distributedTrackPlayCount ) AS consolidatedTrackPlayCount
        FROM withDistributedTrackPlayCount
        GROUP BY withDistributedTrackPlayCount.playlist_id
    ) withConsolidatedTrackCount
) withMaxTrackPlayCount ON withDistributedTrackPlayCount.playlist_id = withMaxTrackPlayCount.playlist_id;
注意:我还不能测试这个,因为我没有一个合适的等效数据库,而必须构建一个。如果您有脚本来构建和填充上述内容,请修改您的问题以包含它们

注意:我假设“播放的曲目数”是指属于某个播放列表的曲目的计数,这些曲目至少作为该播放列表的一部分播放了一次。如果是指属于播放列表的曲目作为播放列表的一部分或其他内容播放的总次数,请说出,我将修改我的答案

注意:您已经声明一个曲目可以由多个用户添加到播放列表中,每个用户可能会多次添加该曲目。我假设“最流行歌曲”是指一个播放列表中一首曲目的所有列表的播放总数


我欢迎所有与此答案相关的建设性问题或评论。

如果一个播放列表下有多个曲目的播放次数与该播放列表下任何曲目的最大播放次数相同,您的输出会是什么样子?如果您能详细说明表的结构,将会有所帮助。您不需要包含不会用作主键、外键或相关数据的字段。这些统计数据是针对特定用户还是针对所有用户的?不同用户是否可以将曲目添加到一个播放列表?@Pons:输出将显示所有播放次数最高的曲目谢谢@toonice,您的假设都是正确的。当我运行此查询时,会收到一条错误消息
错误代码:1146。表“mydb.withdistributedtrackplaycount”不存在
。我使用的是MySQL 5.7.17,我在SQL语句之前创建了一个视图“withDistributedTrackPlayCount”,并删除了主查询中withDistributedTrackPlayCount的子查询
(选择…)。然而,return语句只给了我一行(第一个播放列表)。我修改了上面的内容,以消除错误的一个理论原因。我已经基于该图创建了一个示例数据库,并且正在填充它。我应该很快就能做我自己的测试了。谢谢@toonice,我使用了视图,并将您的版本调整为一个工作查询