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 сообщений
3562 сообщения
#12 лет назад
WebDesignStudio, сомневаетесь что не нужно передавать значения от СУБД скрипту? о_О
1649 сообщений
#12 лет назад
SmartDesign, нет. Но так как писал uniq-ip, скрипту передаются не меньше строк
105 сообщений
#12 лет назад
WebDesignStudio, после приведенного запроса скрипту нужно передать только результат - одну переменную @max, а не всю таблицу.SELECT @max;
3562 сообщения
#12 лет назад
WebDesignStudio, из такого запроса можно вернуть только значение переменной. Я могу сказать что в этом случае сэкономится время на передаче объема данных. По поводу оправданности такого решения - см. выше.
1649 сообщений
#12 лет назад
Ладно, уговорили. Пусть ТС делает так, а я лично сделал бы на стороне скрипта.
3562 сообщения
#12 лет назад
WebDesignStudio, не только вы, до тех пор пока в таблице нет миллионов записей - нет никакого смыал уносить это в БД. Скриптом это проще-гибче-нагляднее.