Дима Г.
87 сообщений
#12 лет назад
Добрый день! Помогите составить SQL запрос (MySQL).

Есть таблица:

Милан +
Милан -
Милан -
Милан -
Милан +
Милан +
Милан -


Каким SQL запросом можно подсчитать максимальное колицество идущих подряд плюсов в таблице?
Сергей К.
1649 сообщений
#12 лет назад
Цитата ("floppox"):
Если и можно что-то намудрить в хранимых процедурах... и то это такая фигня получится... то сделать это в программе в 100500 раз проще.

абсолютно согласен. Лучше в скрипте это делать.
Вячеслав Г.
105 сообщений
#12 лет назад
SET @i:=0, @max:=0;
SELECT @i:=IF(milan='+', @i+1, 0), @max:=IF(@i>@max ,@i, @max) FROM table;

Как-то так.
Андрей Халецкий
3562 сообщения
#12 лет назад
Один черт прийдется перебирать всю таблицу. Как будете считать SQL запросом или на стороне программы особой разницы не заметите (если там не десятки миллионов записей).
Сергей К.
1649 сообщений
#12 лет назад
Цитата ("uniq-ip"):
SET @i:=0, @max:=0;
SELECT @i:=IF(milan='+', @i+1, 0), @max:=IF(@i>@max ,@i, @max) FROM table;

Как-то так.


а зачем так издеваться то?
Вячеслав Г.
105 сообщений
#12 лет назад
ТС был задан вопрос: "Каким SQL запросом можно подсчитать..."
Предложите что-то более оптимальное. Самому интересно.
Сергей К.
1649 сообщений
#12 лет назад
Цитата ("uniq-ip"):
ТС был задан вопрос: "Каким SQL запросом можно подсчитать..."
Предложите что-то более оптимальное. Самому интересно.

а вы проверили если это работает? Я предложение уже писал выше.
Вячеслав Г.
105 сообщений
#12 лет назад
WebDesignStudio, Вы не ответили на вопрос ТС.
Предложенный мною вариант рабочий - используются всего две переменные.
А вообще, большие таблицы - это особый случай - с ними куда оптимальнее работать с помощью самой MySQL, чем передавать всю таблицу скрипту.
Сергей К.
1649 сообщений
#12 лет назад
uniq-ip, я ответ дал - это лучше делать скриптом, и не нужно все таблицу получать. Вы сначала проверьте свой запрос, он не работает
Сергей К.
1649 сообщений
#12 лет назад
А, нет - работает там что то. Но он возвращает не одно значение у вас а столько сколько есть в таблице. Какое тогда преимущество перед скриптовым решением?
Вячеслав Г.
105 сообщений
#12 лет назад
WebDesignStudio, для того, чтобы найти любой максимум - нужно пройти всю таблицу
Запрос рабочий - работает уже много лет, правда, в несколько видоизменнном виде. Само собой разумеется, после запроса нужно не забыть получить саму переменную @max.
Сергей К.
1649 сообщений
#12 лет назад
uniq-ip, а в чем преимущество вашего метода, поделитесь? В результате, ваш запрос вернет столько строк сколько в таблице.
Андрей Халецкий
3562 сообщения
#12 лет назад
Цитата ("WebDesignStudio"):
uniq-ip, а в чем преимущество вашего метода, поделитесь? В результате, ваш запрос вернет столько строк сколько в таблице.
преимещество очевидно, в том что не нужно передавать данные от СУБД скрипту, инкремент я думаю и там и там работает одинаково.

Для таблиц не больших размеров выигрыш по скорости - сомнителен, а вот сложности в отладке обеспечены.
Сергей К.
1649 сообщений
#12 лет назад
Цитата ("SmartDesign"):
преимещество очевидно

я как то сомневаюсь. Есть аргументы?
Андрей Халецкий
3562 сообщения
#12 лет назад
WebDesignStudio, сомневаетесь что не нужно передавать значения от СУБД скрипту? о_О
Сергей К.
1649 сообщений
#12 лет назад
SmartDesign, нет. Но так как писал uniq-ip, скрипту передаются не меньше строк Вы можете сказать что скорость выполнения(в этот конкретный случай) будет выше если делать все на стороне СУБД?
Вячеслав Г.
105 сообщений
#12 лет назад
WebDesignStudio, после приведенного запроса скрипту нужно передать только результат - одну переменную @max, а не всю таблицу.
SELECT @max;
Андрей Халецкий
3562 сообщения
#12 лет назад
WebDesignStudio, из такого запроса можно вернуть только значение переменной. Я могу сказать что в этом случае сэкономится время на передаче объема данных. По поводу оправданности такого решения - см. выше.
Сергей К.
1649 сообщений
#12 лет назад
Ладно, уговорили. Пусть ТС делает так, а я лично сделал бы на стороне скрипта.
Андрей Халецкий
3562 сообщения
#12 лет назад
WebDesignStudio, не только вы, до тех пор пока в таблице нет миллионов записей - нет никакого смыал уносить это в БД. Скриптом это проще-гибче-нагляднее.