Выберите N-ую запись из MySQL-запроса из миллионов строк

У меня есть запрос MySQL, как показано ниже; Я хотел бы выбрать верхнюю запись для каждого диапазона из 600 записей в таблице с 1,8 млн. Записей. До сих пор я должен выполнить цикл 3000 раз, чтобы выполнить это, что не является эффективным решением.

Схема базы данных;

 Table: bet_perm_13predict
id     bet_id      perm_id     avg_odd     avg_odd2    avg_odd3
1      23          1           43.29       28.82       28.82
2      23          2           42.86       28.59       28.59
3      23          3           43.13       28.73       28.73


Table: bet_permute_13games
perm_id    perm_code
1      0000000000000
2      0000000000001
3      0000000000002
4      0000000000010

Пример MySQL Query в PHP

$totRange   = 0; //Used as starting point in rang
$range      = 600; //Used as range
$stop       = 0;//Used as endPoint of range

while($totRange < 1800000){
$stop   = $totRange+$range;

$sql = "SELECT (tb1.avg_odd2 + tb1.avg_odd3) AS totAvg_odd ,
tb1.perm_id , tb1.avg_odd, tb1.avg_odd2, tb1.avg_odd3, tb2.perm_code
FROM bet_perm_13predict tb1
INNER JOIN bet_permute_13games tb2 ON tb2.perm_id = tb1.perm_id
WHERE tb1.bet_id = '$bet_id' && tb1.perm_id
BETWEEN $startRange AND $stop ORDER BY totAvg_odd ASC LIMIT 1"
$q1    = $this->db->query($sql);
$totRange = $stop;
}

Другими словами, я хочу выбрать выборку данных, которая будет представлять всю таблицу, причем выборка не случайная, а предопределенная с использованием верхней записи в диапазоне 600. До сих пор я понятия не имею, как поступить. Нет четких онлайн-материалов на эту тему.

-1

Решение

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

DEMO

SELECT ID, ID DIV 600 as grp
FROM Table1

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

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

1

Другие решения

Для тех, кто может столкнуться с той же проблемой, вот как я решил ее. Я использовал предложение @Juan Carlos и добавил способ поднять лучшую запись группы, используя Subquery.

SELECT * FROM
(SELECT * , perm_id DIV $limit as grp , (avg_odd2 + avg_odd3) AS totAvg_odd
FROM bet_perm_13predict WHERE bet_id = '$bet_id'  ORDER BY grp ASC ) tb1
INNER JOIN bet_permute_13games tb2 ON tb2.perm_id = tb1.perm_id
INNER JOIN bet_entry tb3 ON tb3.bet_id = tb1.bet_id
WHERE tb1.avg_odd2 < (SELECT AVG(avg_odd2) FROM bet_perm_13predict WHERE bet_id = '$bet_id' )
&& tb1.avg_odd3 < (SELECT AVG(avg_odd3) FROM bet_perm_13predict WHERE bet_id = '$bet_id' )
GROUP BY grp ORDER BY totAvg_odd ASC
LIMIT 100
0

По вопросам рекламы [email protected]