Дима Г.
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, не только вы, до тех пор пока в таблице нет миллионов записей - нет никакого смыал уносить это в БД. Скриптом это проще-гибче-нагляднее.