在实时数据库中查找比MYSQL表中最后一条记录低的下一个最小值

问题描述 投票:1回答:2

我有一个简单的表,可以像这样跟踪视频文件和program_id号:

| --------------------- | ------------------ | -------- ---------- || id |文件名| program_id || --------------------- | ------------------ | -------- ---------- || 1 | vid1.mp4 | 1001 || --------------------- | ------------------ | -------- ---------- || 2 | vid2.mp4 | 1010 || --------------------- | ------------------ | -------- ---------- || 3 | vid3.mp4 | 1005 || --------------------- | ------------------ | -------- ---------- |

我想做的是提取最低的程序ID,然后从数据库中提取下一个最低的程序ID。 program_id不是线性的,因为我在它们之间插入和删除了视频,因此如果添加了新视频,则循环代码可以提取下一个最低的视频。因此,在第一遍时,我希望期望1001,下一遍1005,然后下一遍1010。

现在,我成功地拥有了这个位置,可以在python中拉出最低的program_id:

while true:
    sql = "SELECT * FROM videos WHERE program_id =  ( SELECT MIN(program_id)  FROM video)"
    cnx.execute (sql)
    result = cnx.fetchall()
    for qq in result:
        id = qq[0]
        filename = qq[1]
        program_id = qq[3]

  playVideo(filename)

有没有一种方法可以使用循环,并使用最后一个programn_id进行另一个查询并从中选择下一个最低值?

python mysql sql database min
2个回答
1
投票

使用下一个视频的限制和偏移量

CREATE TABLE videos  (
  `id` INTEGER,
  `filename` VARCHAR(8),
  `program_id` INTEGER
);

INSERT INTO videos 
  (`id`, `filename`, `program_id`)
VALUES
  ('1', 'vid1.mp4', '1001'),
  ('2', 'vid2.mp4', '1010'),
  ('3', 'vid3.mp4', '1005');
✓✓
SELECT * FROM videos  ORDER BY program_id ASC LIMIT 1 OFFSET 0;
id |文件名| program_id-:| :------- | ---------:1 | vid1.mp4 | 1001
SELECT * FROM videos  ORDER BY program_id ASC LIMIT 1 OFFSET 1;
id |文件名| program_id-:| :------- | ---------:3 | vid3.mp4 | 1005
SELECT * FROM videos  ORDER BY program_id ASC LIMIT 1 OFFSET 2;
id |文件名| program_id-:| :------- | ---------:2 | vid2.mp4 | 1010

db <>小提琴here

i = 0
while true:
    sql = "SELECT * FROM videos  ORDER BY program_id ASC LIMIT 1 OFFSET "+str(i);
    cnx.execute (sql)
    result = cnx.fetchall()
    for qq in result:
        id = qq[0]
        filename = qq[1]
        program_id = qq[3]
    i = i +1
    playVideo(filename)

但是由于您只得到一行,所以不需要for循环。

此外,例如,当不再有行时,您还需要一个断点来退出While循环。


1
投票

我真的看不到运行单独的查询来获取每一行的意义。

您可以简单地运行一个查询,为您提供按program_id排序的视频,然后循环查询的结果

while true:
    sql = "SELECT * FROM videos ORDER BY program_id"
    cnx.execute (sql)
    result = cnx.fetchall()
    for qq in result:       -- fetch each video, ordered by "programm_id"
        id = qq[0]
        filename = qq[1]
        program_id = qq[3]
        playVideo(filename) -- play this video
© www.soinside.com 2019 - 2024. All rights reserved.