У меня есть запрос 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. До сих пор я понятия не имею, как поступить. Нет четких онлайн-материалов на эту тему.
Вы можете использовать целочисленное деление для создания групп.
SELECT ID, ID DIV 600 as grp
FROM Table1
Затем найдите максимальное значение для каждой группы. Некоторые варианты здесь
Получить записи с максимальным значением для каждой группы сгруппированных результатов SQL
Для тех, кто может столкнуться с той же проблемой, вот как я решил ее. Я использовал предложение @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