Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / большой поток данных из mysql / 13 сообщений из 13, страница 1 из 1
13.11.2014, 19:19
    #38805430
Артем_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
большой поток данных из mysql
Всем привет.
имеется таблица:
booker event totals under overbooker1 CSKA vs Spartak 1.5 6.5 1.08booker1 CSKA vs Spartak 2.5 3.2 1.28booker1 CSKA vs Spartak 3.5 2 1.7booker1 CSKA vs Spartak 4.5 1.48 2.45booker1 CSKA vs Spartak 5.5 1.2 3.8booker1 CSKA vs Spartak 6.5 1.08 6booker2 CSKA vs Spartak 1.5 5.5 2.08booker2 CSKA vs Spartak 2.5 4.2 3.28booker2 CSKA vs Spartak 3.5 2 5.7booker2 CSKA vs Spartak 4.5 2.48 4.45booker2 CSKA vs Spartak 5.5 4.2 2.8booker2 CSKA vs Spartak 6.5 3.08 3

Учитывая, что:
- событий много
- тоталов много
- на каждый тотал каждого события разные букмекеры дают свои коэффициенты.
- могут быть события, на чей тотал коэффициент дает только одby букмекер.

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

Мне нужно вывести из таблицы данные, группируя по booker,event,totals игнорируя те тоталы, на которые кф дает только один букмекер.

Делаю так:
Код: sql
1.
2.
3.
4.
5.
SELECT o.event
FROM odds_totals o
GROUP BY o.event, o.totals
HAVING COUNT( * ) >1
ORDER BY o.event


получаем названия событий по условиям задачи. Теперь мне нужно получить сами коэффициенты на эти тоталы группируя по букмекерам. Вот тут и возникает взрыв.
Первый запрос выдает резельтат - почти 4 тысячи событий.
Второй запрос, выдает почти 10тысяч строк. И это не предел, т.к. событий будет в разы больше.

Второй запрос выглядит так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	SELECT t.event, t.booker, t.totals, t.under, t.over
	FROM (
		SELECT o.event
		FROM odds_totals o
		GROUP BY o.event, o.totals
		HAVING COUNT( * ) >1
		ORDER BY o.event
	) o
	LEFT JOIN odds_totals t ON t.event = o.event
	GROUP BY t.event, t.totals, t.booker
	ORDER BY t.event, t.totals



Но когда я вспоминаю о том, что помимо запроса в базу, мне еще нужно в php несколько раз прогнать этот массив по несколько раз, я понимаю почему у меня сервер записает каждый раз.
Помогите кто-нибудь оптимизировать запрос или может поправить структуру таблицы. не предлагайте разбивать на несколько таблиц - этот вариант не рассматриваем.
часть дампа прикрепляю. Спасибо
...
Рейтинг: 0 / 0
13.11.2014, 19:28
    #38805437
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
большой поток данных из mysql
если тебе правда нужно 4 тыщи строчек в одной таблице, значит надо что то менять в кончерватроии.
...
Рейтинг: 0 / 0
14.11.2014, 11:50
    #38805993
Артем_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
большой поток данных из mysql
ScareCrow,
Прошу прощения, но я ничего не понял из того, что вы написали. вы можете подсказать что-то по сути вопроса?
...
Рейтинг: 0 / 0
14.11.2014, 13:11
    #38806228
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
большой поток данных из mysql
Артем_sqlScareCrow,
Прошу прощения, но я ничего не понял из того, что вы написали. вы можете подсказать что-то по сути вопроса?

обясняю.. гугл выдаёт результаты по 10 не для понта, а потому что никто не будет перечитывать список в 50 елементов.

зачем выводить 4000 строк сразу?
...
Рейтинг: 0 / 0
14.11.2014, 15:47
    #38806533
Артем_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
большой поток данных из mysql
alex564657498765453, объясняю..
сначала я вывожу события, у которых есть тотал, на который кф дают более 1 букмекера. Далее я провожу другие расчеты из выведенных результатов и ЕСЛИ что-то подходит под мои условия расчетов, то я их вывожу. Я не могу в запросе вставить limit потому что, если я буду выводить с лимитом, то из выведенных данных может ни одна не окажется нужной.

после получения результатов запроса, я создаю такой массив:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
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
                        )

                )

            [1.5] => Array
                (
                    [under] => Array
                        (
                            [betclic] => 4
                            [brkings] => 4.5
                            [expekt] => 4
                        )

                    [over] => Array
                        (
                            [betclic] => 1.2
                            [brkings] => 1.16
                            [expekt] => 1.2
                        )

                )
..... другое событие со своими данными ....


Если нарисовать это в таблице, то получается так:
Код: sql
1.
2.
3.
4.
5.
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, тогда записываю данные в массив такой:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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, вывести те записи, которые были задействованы пнри умножении, в нашем случае чтобы результат запроса был такой:
Код: sql
1.
2.
betclic	Stan Wawrinka - Marin Cilic	0.5	10.5	1.5
brkings	Stan Wawrinka - Marin Cilic	0.5	12	0.99


функции и процедуры допускаются. что угодно, лишь бы работало быстро
...
Рейтинг: 0 / 0
14.11.2014, 16:00
    #38806564
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
большой поток данных из mysql
Артем_sqlМожно ли в select сделать все эти расчеты?Думаю, вполне можно. Во всяком случае, в мускуле кроме простейшей арифметики есть довольно много всяких функций и операторов , включая хранимые процедуры.
...
Рейтинг: 0 / 0
14.11.2014, 16:08
    #38806582
Артем_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
большой поток данных из mysql
vkle, многосодержательный ответ. Спасибо.
Я знаю, что в мускуле много всякого интересного.
Что решит мой вопрос, так это в цикле дважды прогнать результат запроса, который выведет мне все нужные записи.
Возможно это в мускуле?
...
Рейтинг: 0 / 0
17.11.2014, 10:57
    #38807963
Артем_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
большой поток данных из mysql
Никто не подскажет?
...
Рейтинг: 0 / 0
17.11.2014, 19:05
    #38808749
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
большой поток данных из mysql
Артем_sqlНикто не подскажет?

невчитывался детально в расписаную логику, что за муть ты делаешь с результатом в цикле...но как пример

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t.event, t.booker, t.totals, t.under, t.over
	FROM (
		SELECT o.event
		FROM odds_totals o
		GROUP BY o.event, o.totals
		HAVING COUNT( * ) >1
		ORDER BY o.event
	) o
	LEFT JOIN odds_totals t ON t.event = o.event
	GROUP BY t.event, t.totals, t.booker
	ORDER BY t.event, t.totals



Кручу-Верчу-ЗапутатьХочу

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t.event, t.booker, t.totals, t.under * t.over as 'mysql__ya_sam_umeyu_umnowat'
	FROM (
		SELECT o.event
		FROM odds_totals o
		GROUP BY o.event, o.totals
		HAVING COUNT( * ) >1
		ORDER BY o.event
	) o
	LEFT JOIN odds_totals t ON t.event = o.event
	GROUP BY t.event, t.totals, t.booker
	ORDER BY t.event, t.totals
...
Рейтинг: 0 / 0
17.11.2014, 19:10
    #38808753
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
большой поток данных из mysql
Напишу запрос, если увижу постановку задачи ввида

ИСПОЛЬЗУЕМЫЕ таблицы
table1(f1,f2,f3...перечисление всех полей)
другие таблицы.

без долгого эпоса, написать

получить список вида
table1.f2, table1.f3, calcf1 ....перечислить все поля результата

описываем вычисляемые
calcf1 = table1.f2*table2.f5+ЕСЛИ(если tablefdate сегодняшняя, то table1.f3 иначе table2.f4)

ну и логику отбора
1)field1.fdate в диапазоне +- 5 дней от сегодняшнего....
....
...
Рейтинг: 0 / 0
18.11.2014, 11:09
    #38809204
Артем_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
большой поток данных из mysql
alex564657498765453,

ок, попробую коротко и ясно написать.

Есть таблица, дамп я прислал выше.
Код: sql
1.
2.
3.
4.
 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, то вывожу те записи, которые попали под мои условия.
...
Рейтинг: 0 / 0
18.11.2014, 11:13
    #38809208
Артем_sql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
большой поток данных из mysql
Выбираю из таблицы те записи, на которые кф дает более одного букмекера так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t.event, t.booker, t.totals, t.under, t.over
FROM(
    SELECT 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



Далее перемножаю все в php и отлично работает. Но это если мало данных. А если данных много, то 504. Поэтому ищу возможность в mysql не только отбирать, но и перемножать и выводить только те записи, которые мне подходят.
...
Рейтинг: 0 / 0
19.11.2014, 16:54
    #38810987
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
большой поток данных из mysql
Артем_sqlВыбираю из таблицы те записи, на которые кф дает более одного букмекера так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t.event, t.booker, t.totals, t.under, t.over
FROM(
    SELECT 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



Далее перемножаю все в php и отлично работает. Но это если мало данных. А если данных много, то 504. Поэтому ищу возможность в mysql не только отбирать, но и перемножать и выводить только те записи, которые мне подходят.

1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT t.event, t.booker, t.totals, t.under, t.over
FROM(
    SELECT 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


зачем последний гроупбай? типо уникальные найти?

допустим гдето у нас есть три записи - каунт равен 3 в внутренем запросе.
что на что мы умножаем и сравнивая с 10?

а если 100 букмекеров дали свои данные на один матч?

я так понял, перемножаем все возможные пары.

тогда надо ити путём

from t1 left join t2 on (t1.action=t2.action and t1.totals = t2.totals and t1.booker<>t2.booker)

where t2.booker IS NOT NULL

теперь селект
select t1.under*t2.over,t1.action,t1.booker,t1.under,t2.booker,t2.booker

where ... and t1.under*t2.over > 10

но у нас будут дубли
а имено на каждую пару две записи
по типу петя вася и вася петя...если это тоже надо разруливать, тогда
вместо t1.booker<>t2.booker ---------t1.booker<t2.booker

тоесть если образовалась пара петя вася, то наоборот пара не орбазуеться.



ты писал
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Array
(
    [10.395] => Array
    (
        [Stan Wawrinka - Marin Cilic] => Array
        (
            [under] => Array
            (
                [betclic] => 10.5
            )
            [over] => Array
            (
                [brkings] => 0.99
            )
            [end] => 10.395
        )
    )
)



и получил результат ввиде
10,395 Stan Wawrinka - Marin Cilic betclic 10.5 brkings 0.99
....

и все такие строчки.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / большой поток данных из mysql / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]