SQLinfo.ru - Все о MySQL Highload++ Junior 2017

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.07.2016 12:44:41

Roman1984
Участник
Зарегистрирован: 20.07.2016
Сообщений: 7

Поиск следующих/предыдущих пар комманд из календаря

Доброго времени суток!
Занимаюсь анализом статистики футбольных матчей и встал вопрос поиска предыдущих/следующих матчей в чемпионате для текущей пары. Попытаюсь объяснить на скриншотах, что требуется:
http://joxi.ru/DrlQawpS4lNjgm
Есть пара команд, которую я нашел по запросу вида: "SELECT `id_auto`, `date`, `tour`, `team1`, `team2`, `score` FROM table WHERE `id_auto` = 374",
теперь требуется далее по строкам таблицы найти следующие пары для найденных команд и вывести эти строки. Так если у меня, например, по запросу выдало команды Арсенал и Астон Вилла, то следующие искомые строки будут содержать "Челси - Астон Вилла" и "Фулхем - Арсенал" (видно на скриншоте).
Важный момент: интересует реализация поиска через курсоры.
С запросами работаю в связке с php, то есть имеется возможность сохранять название найденных комманд в переменные $team1 и $team2 к примеру.

Отредактированно Roman1984 (20.07.2016 12:51:33)


Прикрепленные файлы:
Attachment Icon d758c02a21.png, Размер: 129,693 байт, Скачано: 45

Неактивен

 

#2 20.07.2016 13:14:25

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5130

Re: Поиск следующих/предыдущих пар комманд из календаря

следующие матчи для найденной пары:

SELECT `id_auto`, `date`, `tour`, `team1`, `team2`, `score` FROM table WHERE tour = $tour + 1 and (team1 in ($team1,$team2) or team2 in ($team1,$team2));


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

Неактивен

 

#3 20.07.2016 13:43:20

Roman1984
Участник
Зарегистрирован: 20.07.2016
Сообщений: 7

Re: Поиск следующих/предыдущих пар комманд из календаря

vasya написал:

следующие матчи для найденной пары:

SELECT `id_auto`, `date`, `tour`, `team1`, `team2`, `score` FROM table WHERE tour = $tour + 1 and (team1 in ($team1,$team2) or team2 in ($team1,$team2));


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

Ваше решение, как частное решение для поиска пред/след игры по календарю чемпионата меня вполне устраивает.
Однако, не всегда следующий матч - это тот матч, который идет следующим по туру. Например, в моем примере "Челси - Астон Вилла" следующий матч по времени(дате) - это матч 3го тура, а не следующего 2го тура (там произошел какой-то перенос матча).
Кроме этого, в дальнейшем предполагается объединение нескольких таблиц различных чемпионатов для поиска в них следующего соперника. Так, например, для Арсенала (или другой команды) следующей игрой может быть просто товарищеский матч, матч в кубке страны или европейском чемпионате из которых надо будет вывести для него соперника. Поэтому исходя из своего скромного опыта, считаю, что тут лучше всего оперировать курсорами.

Отредактированно Roman1984 (20.07.2016 14:03:48)

Неактивен

 

#4 20.07.2016 14:26:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5130

Re: Поиск следующих/предыдущих пар комманд из календаря

тогда следующие  матчи это

SELECT `id_auto`, `date`, `tour`, `team1`, `team2`, `score` FROM table WHERE `date`>$date and team1 in ($team1,$team2) order by `date` desc limit 1;

SELECT `id_auto`, `date`, `tour`, `team1`, `team2`, `score` FROM table WHERE `date`>$date and team2 in ($team1,$team2) order by `date` desc limit 1;


в случае объединения нескольких таблиц ищите по нескольким таблицам через union
курсоры тут совсем не к месту

Неактивен

 

#5 20.07.2016 16:53:20

Roman1984
Участник
Зарегистрирован: 20.07.2016
Сообщений: 7

Re: Поиск следующих/предыдущих пар комманд из календаря

vasya написал:

тогда следующие  матчи это

SELECT `id_auto`, `date`, `tour`, `team1`, `team2`, `score` FROM table WHERE `date`>$date and team1 in ($team1,$team2) order by `date` desc limit 1;

SELECT `id_auto`, `date`, `tour`, `team1`, `team2`, `score` FROM table WHERE `date`>$date and team2 in ($team1,$team2) order by `date` desc limit 1;

В данном случае возможно неточное отображение результатов, так выполнение этих запросов выведет:
строку c id=370 и строку с id=363 из http://joxi.ru/DrlQawpS4lNjgm , то есть:
Астон Вилла - Ливерпуль
Челси - Астон Вилла
Так Астон Вилла встречается ещё раз, а нужно было вывести пару для Арсенала.
Однако я решил проблему таким образом:

SELECT `id_auto`, `date`, `tour`, `team1`, `team2`, `score` FROM `$mytable` WHERE `date`>'$mydata' and ('$team1') in (`team1`,`team2`)  order by `date` asc limit 1;
SELECT `id_auto`, `date`, `tour`, `team1`, `team2`, `score` FROM `$mytable` WHERE `date`>'$mydata' and ('$team2') in (`team1`,`team2`)  order by `date` asc limit 1;

Не знаю, правильно ли я сделал, но работает! Правда, если я буду делать ещё проверку по счету, то мне может вернуть результат очень далекого в будущем матча, но тут наверное, с условиями надо поработать будет...

И всё же я бы хотел знать решение с курсорами, поэтому милости прошу увидеть Ваши комменты решения с курсорами! smile

Отредактированно Roman1984 (20.07.2016 16:54:47)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson