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这不是最有效的解决方案,而且可能会非常消耗资源,因为要处理的行数是表中的行数*表中的行数。好的,这非常有效!非常感谢您花时间做这件事并帮助我。