Mysql помогите придумать запрос или процедуру

Artem_Paris

Новичок
Всем привет. Не знаю, как коротко написать, поэтому пишу все.
имеется таблица:
Код:
booker             event    totals  under   over
booker1    CSKA vs Spartak    1.5    6.5    1.08
booker1    CSKA vs Spartak    2.5    3.2    1.28

booker2    CSKA vs Spartak    1.5    5.5    2.08
booker2    CSKA vs Spartak    2.5    4.2    3.28
Учитывая, что:
- событий много
- тоталов много
- на каждый тотал каждого события разные букмекеры дают свои коэффициенты.
- могут быть события, на чей тотал коэффициент дает только один букмекер. их исключаем в запросе

Задача такая.

Мне нужно вывести из таблицы данные, группируя по booker,event,totals игнорируя те тоталы, на которые кф дает только один букмекер.
Делаю так:
Код:
SELECT t.event, t.booker, t.totals, t.under, t.over
FROM(
    SELECT count(*),o.event, o.booker, o.totals
    FROM odds_totals o

    GROUP BY o.event, o.totals
    having count(*)>1
    ORDER BY o.event, o.booker, o.totals
    ) o
LEFT JOIN odds_totals t on t.event = o.event and t.totals= o.totals
GROUP BY t.event, t.totals, t.booker
Запрос работает. все выводит как надо. НО зависает при наличии свыше 10тыс записей.
Дальше полученный результат записываю в массив такого типа:
Код:
Array
(
    [AA Gent - Cercle Brugge] => Array
        (
            [0.5] => Array
                (
                    [under] => Array
                        (
                            [betclic] => 10.5
                            [brkings] => 12
                            [expekt] => 11
                        )

                    [over] => Array
                        (
                            [betclic] => 1.5
                            [brkings] => 0.99
                            [expekt] => 1.03
                        )

                )
Если нарисовать это в таблице, то получается так:
Код:
booker | under | over
---------------------
betclic|  10.5 |1.5
brkings|  12   |0.99
expekt |  11   |1.03
Далее мне надо дважды прокрутить этот массив в цикле, чтобы перемножить так:
10.5*0.99 = ?
10.5*1.03 = ?
12*1.5 = ?
12*1.03 = ?
11*1.5 = ?
11*0.99 = ?

И уже если какое-то из этих произведений больше нужной цифре, например 10, тогда записываю данные в массив такой:

Код:
Array
(
    [10.395] => Array
    (
        [Stan Wawrinka - Marin Cilic] => Array
        (
            [under] => Array
            (
                [betclic] => 10.5
            )
            [over] => Array
            (
                [brkings] => 0.99
            )
            [end] => 10.395
        )
    )
)
Вопрос:
Можно ли в select сделать все эти расчеты? чтобы сначала выводилось не всё, а потом с помощью php отсекались ненужные, а выводилось сразу уже нужные event, например?
А точнее:
1. выбрать события, у которых кф на тотал дают хотя бы два букмекера.
2. перемножить их между собой, как я писал выше
3. и если произведение выше например 10, вывести те записи, которые были задействованы пнри умножении, в нашем случае чтобы результат запроса был такой:

Код:
betclic    Stan Wawrinka - Marin Cilic    0.5    10.5    1.5
brkings    Stan Wawrinka - Marin Cilic    0.5    12    0.99
функции и процедуры допускаются. что угодно, лишь бы работало быстро
 

AnrDaemon

Продвинутый новичок
Тебе уже пальцем ткнули в проблему. Думаю, не надо доводить ситуацию до тычков носом?
 

Artem_Paris

Новичок
Тебе уже пальцем ткнули в проблему. Думаю, не надо доводить ситуацию до тычков носом?
На что мне ткнули носом? на то, что я подробно расписал суть проблемы? По теме есть у тебя решение? или ты тут выступаешь только?
 

AnrDaemon

Продвинутый новичок
Проблема в том, что ты не понимаешь собственной проблемы. ЗА тебя тут никто не будет ничего делать, извини.
Начни что-то делать, напиши код, который хотя бы как-то работает. Не важно, коротко или длинно.
Написал, но он не работает так, как тебе хочется? Значит, ты где-то шибся. Займись отладкой.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
AnrDaemon, предлагаю тебе успокоиться. Человек вполне нормально описал проблему. Просто понять пока по его запросу, почему запрос работает плохо на 10к - нельзя.

Artem_Paris, смотри explain запроса, какие индексы и т.д.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
AnrDaemon, предлагаю тебе успокоиться. Человек вполне нормально описал проблему. Просто понять пока по его запросу, почему запрос работает плохо на 10к - нельзя.
Можно конечно. На вложенном подзапросе происходит filesort. И если бы он попытался запрос отладить, как AnrDaemon предлагает, он бы в эксплейне это увидел.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
флоппик, 10к записей и filesort убивающие все. Сюжет, блин, блокбастера. Верить верю, но не верю)))
 

флоппик

promotor fidei
Команда форума
Партнер клуба
флоппик, 10к записей и filesort убивающие все. Сюжет, блин, блокбастера. Верить верю, но не верю)))
у меня тут был прецендент с 2k записей на подзапросе с файлсортом, который ложил AWS RDS m3.2xlarge, а это, на минуточку, 8 vCPU и 30Гб озу, что абсолютно не спасало, т.к тупо упиралось в IOPSы.
Это мускул, детка.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
При этом, ессно, сам подзапрос выполненный отдельно прекрасно оптимизировался оптимизатором и выполнялся какие-то смешные тысячные доли секунды. Просто мускульный планировщик на одном месте вертел оптимизацию и анализ в подзпросах.
 

Artem_Paris

Новичок
Проблема в том, что ты не понимаешь собственной проблемы. ЗА тебя тут никто не будет ничего делать, извини.
Начни что-то делать, напиши код, который хотя бы как-то работает. Не важно, коротко или длинно.
Написал, но он не работает так, как тебе хочется? Значит, ты где-то шибся. Займись отладкой.
Ты слепой или прикалываешься? Я мало кода написал выше?

Смотрите какая ситуация. Постараюсь максимально коротко.
В таблице каждая запись - это матч, букмекер, и его коэффициенты на победу первой команды или победу второй.
Запросом я должен выбрать сначала все матчи, на которые есть коэфф минимум от двух букмекеров.
Код:
 booker            event                 total  par1   par2
betclic   Stan Wawrinka - Marin Cilic    0.5    12     0.99
brkings   Stan Wawrinka - Marin Cilic    0.5    11     0.7
nordic    Stan Wawrinka - Marin Cilic    0.5    10.5   1.2
Это я делаю подзапросом. Далее я должен перемножить par1 из одной записи на par2 из другой записи.И если произведение больше 10, например, тогда я вывожу те записи, которые попали под мое условие.

В принципе описанный выше запрос работает. его результат я перемножаю уже в php и все отлично. но это если мало данных. А если много данных, то застреваем на 504.
 
Сверху