Выберите N-ую запись в запросе MySQL из миллионов строк - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть запрос 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 in 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. До сих пор я понятия не имею, как поступить.По этому вопросу нет четких онлайн-материалов.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Для тех, кто может столкнуться с той же проблемой, вот как я решил ее.Я использовал предложение @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 голосов
/ 24 сентября 2018

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

DEMO

SELECT ID, ID DIV 600 as grp
FROM Table1

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

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

...