Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.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
Python SQLite:总列值,然后与输入进行比较_Python_Sql_Python 3.x_Sqlite - Fatal编程技术网

Python SQLite:总列值,然后与输入进行比较

Python SQLite:总列值,然后与输入进行比较,python,sql,python-3.x,sqlite,Python,Sql,Python 3.x,Sqlite,在我的测试程序中,用户输入他们想要播放列表的总时间,然后生成一个不再是给定时间的播放列表。但是,我在这方面遇到了一些问题,因为我无法确定如何计算播放列表中歌曲的总长度,然后确保查询不再是给定的时间。有人能帮帮我吗? 这是我的代码: c、 执行“从歌曲中选择TotalSongLength作为TotalSongLength、歌曲名称、艺术家、流派、专辑、年份,TotalSongLength您可以使用sum和group by 对于筛选结果,您应该使用have for aggregated result

在我的测试程序中,用户输入他们想要播放列表的总时间,然后生成一个不再是给定时间的播放列表。但是,我在这方面遇到了一些问题,因为我无法确定如何计算播放列表中歌曲的总长度,然后确保查询不再是给定的时间。有人能帮帮我吗? 这是我的代码:


c、 执行“从歌曲中选择TotalSongLength作为TotalSongLength、歌曲名称、艺术家、流派、专辑、年份,TotalSongLength您可以使用sum和group by

对于筛选结果,您应该使用have for aggregated result,而不是where

 SELECT sum(Length) AS TotalSongLength, "Song Name", "Artist", "Genre", "Album", "Year" 
 FROM Songs 
 GROUP BY "Song Name", "Artist", "Genre", "Album", "Year" 
 HAVING TotalSongLength <= "{0}"'

目前还不能回复评论,但斯凯里奇会为您提供所需的答案

表上的数据类型将迫使您对所查看的所有内容执行一些到秒的转换,如下所示:

 SELECT 
       SongName
     , strftime('%MM', Length) * 60 + strftime('%SS',Length) AS TotalSeconds
     , Length
 FROM Songs 
 GROUP BY SongName, Length
 HAVING TotalSeconds <= "{0}" 

然后,您必须将用户输入解析为秒,并与TotalSeconds进行比较,我认为以下内容可能适用:-

SELECT 
    CASE 
        WHEN seconds > 0 AND seconds < 300 
        THEN 'Playlist OK' 
        ELSE 'Playlist too long or not long enough' 
    END AS result
FROM 
    (SELECT sum((substr(length,1,2) * 60) + substr(length,4,2)) as seconds 
    FROM songs);
其中300是允许的总时间。 测试 这是使用以下方法进行测试的:-

DROP TABLE IF EXISTS songs;
CREATE TABLE IF NOT EXISTS songs ("Song Name" TEXT,"Artist" TEXT, "Genre" TEXT, "Album" TEXT, "Year", length TEXT);
INSERT INTO songs VALUES ('My Song','Fred','Rock','Fred Rocks','1974', '03:11');
INSERT INTO songs VALUES ('Another Song','Bert','Pop','Bert sings','2010', '02:59');
SELECT 
    CASE WHEN seconds > 0 AND seconds < 300 THEN 'Playlist OK' ELSE 'Playlist too long or not long enough' END AS result

FROM (SELECT sum((substr(length,1,2) * 60) + substr(length,4,2)) as seconds FROM songs)
然后:-

注释掉所有插入项, b评论第一首歌, c评论第二首歌和 我不评论任何歌曲 测试结果 播放列表太长或不够长 b播放列表OK c播放列表OK d播放列表太长或不够长 如果您希望时间也以秒为单位,则:-

SELECT seconds,
    CASE 
        WHEN seconds > 0 AND seconds < 300 
        THEN 'Playlist OK' 
        ELSE 'Playlist too long or not long enough' 
    END AS result
FROM 
    (SELECT sum((substr(length,1,2) * 60) + substr(length,4,2)) as seconds FROM songs);
注意,如果没有行,则秒数将为null,而不是0。 再次评论:- 这不是我想要的。而不是说 播放列表低于某个时间或其他时间。我想让它显示所有内容 可以添加在一起的歌曲,无需查看用户输入

我相信,在最后一行的时间限制上,以下内容将达到1000:-

SELECT * 
FROM 
(
    SELECT SUM(a.seconds) AS summed, 
        b."Song Name", 
        b."Artist", 
        b."Genre", 
        b."Album", 
        b."Year", 
        b.length, 
        b.seconds 
    FROM  (
        SELECT *,
            (substr(length,1,2) * 60) + substr(length,4,2) AS seconds 
        FROM songs ORDER BY length) AS a,
    (
        SELECT *,
            (substr(length,1,2) * 60) + substr(length,4,2) AS seconds 
        FROM songs ORDER BY length) AS b 
    WHERE b."Song Name" <= a."Song Name"
    GROUP BY b."Song Name" ORDER BY summed
) 
WHERE summed <= 1000
根据表格:-

在中运行上述结果:-

限制=1000:-

限额=10000:-

限额=600:-


好的,这将非常有效,但是,因为歌曲的格式存储为MM:SS,它不起作用。有没有办法让它把MM:SS转换成秒,然后把SUMLength[以秒为单位]嘿,我又把@Jeremy说的话转换成秒作为一个新的列:LengthSeconds,所以理论上,你的代码应该可以工作,但是,它仍然让我超过600秒10分钟的歌曲/您好,请阅读我发送给@scaisEdge's comment.Hi的评论。谢谢你花时间把这些都写出来,并为我测试一下。代码确实有效,但是,它不是我想要的。而不是说播放列表是否低于某个特定时间或任何东西。我想让它显示所有可以添加在一起的歌曲,而不必检查用户输入。@Jamesmith用可能是解决方案的内容编辑了答案P.S这不是最有效的解决方案,而且可能会非常消耗资源,因为要处理的行数是表中的行数*表中的行数。好的,这非常有效!非常感谢您花时间做这件事并帮助我。