Найти следующее наименьшее значение, чем последняя запись в таблице MYSQL в БД в реальном времени - PullRequest
1 голос
/ 25 марта 2020

У меня есть простая таблица, которая отслеживает видеофайл и номер program_id, например:

|---------------------|------------------|------------------|
|      id             |    filename      |  program_id      |
|---------------------|------------------|------------------|
|          1          |   vid1.mp4       |     1001         |
|---------------------|------------------|------------------|
|          2          |   vid2.mp4       |     1010         |
|---------------------|------------------|------------------|
|          3          |   vid3.mp4       |     1005         |
|---------------------|------------------|------------------|

Что я хотел бы сделать, это получить самый низкий идентификатор программы, затем go и вытащить следующий НИЗКИЙ идентификатор программы из базы данных. ID_программы не является линейным, потому что я вставляю и удаляю видео между ними, чтобы зацикленный код мог вытянуть следующее низшее видео в случае добавления нового. Итак, на первом проходе я хотел бы ожидать 1001, следующий проход 1005, затем следующий проход 1010.

Сейчас у меня успешно просто есть это, где я могу получить самый низкий идентификатор_программы в python:

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)

есть ли способ использовать l oop вокруг и сделать другой запрос, используя последний programn_id и выбрать следующий самый низкий из него?

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Я не вижу смысла в запуске отдельного запроса для получения каждой строки здесь.

Вы можете просто запустить один запрос, который даст вам отсортированные видео, увеличив program_id, а затем l oop над результатами запроса:

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
1 голос
/ 25 марта 2020

USE Предел и смещение для получения следующего видео

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 | filename | program_id
-: | :------- | ---------:
 1 | vid1.mp4 |       1001
SELECT * FROM videos  ORDER BY program_id ASC LIMIT 1 OFFSET 1;
id | filename | program_id
-: | :------- | ---------:
 3 | vid3.mp4 |       1005
SELECT * FROM videos  ORDER BY program_id ASC LIMIT 1 OFFSET 2;
id | filename | program_id
-: | :------- | ---------:
 2 | vid2.mp4 |       1010

дБ <> скрипка здесь

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)

Но так как вы получаете только один ряд вообще вам не нужно для l oop.

Также вам нужна точка останова для выхода из While, например l oop, когда больше нет строк.

...