Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Поиск по данным в БД

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Viper
Отправлено: 30 Июня, 2014 - 18:34:12
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Что есть.
1. Форма с 2 полями rate_min и rate_max (значения от 0 до 10)
2. 2 поля в БД rate_loc и rate_sum_loc. В первом кол-во голосов, во втором общая их сумма(т.е. какую юзер нажал оценку).
К примеру при rate_loc=4 и rate_sum_loc=30 получаем 7,5.

Что нужно - выполнить поиск по этим 2 полям.

Как такое можно реализовать?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Мелкий Супермодератор
Отправлено: 30 Июня, 2014 - 18:58:51
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Т.е. найти те строки, у которых rate_sum_loc/rate_loc находится в промежутке между rate_min и rate_max?

Буквально так и пишется, в общем-то
CODE (SQL):
скопировать код в буфер обмена
  1. (rate_sum_loc/rate_loc) >= rate_min AND (rate_sum_loc/rate_loc) <= rate_max

(Добавление)
Чтобы не играться с дробями, можно сделать rate_sum_loc >= (rate_min * rate_loc)

И, разумеется, индексы в пролёте. Потому желательно сделать отдельное поле, которое пересчитывать по тому же триггеру, но с индексом.


-----
PostgreSQL DBA
 
 Top
Viper
Отправлено: 30 Июня, 2014 - 21:20:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Мелкий пишет:
Потому желательно сделать отдельное поле, которое пересчитывать по тому же триггеру, но с индексом.


Т.е. поле с уже просчитанным результатом и по нему создать индекс?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Мелкий Супермодератор
Отправлено: 30 Июня, 2014 - 21:40:11
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Угу.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 30 Июня, 2014 - 22:55:40
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




думал думал как переумничать Мелкого (поди сумей)
вариант :
а что если вычисленное поле округлить до целого в меньшую сторону
и это ускорит индекс
целочисленное побыстрее ведь
(Добавление)
надеюсь не надо говорить как изменить условие запроса
(Добавление)
ахренеть) бамнул таки)
 
 Top
Viper
Отправлено: 01 Июля, 2014 - 08:54:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




LIME и то верно Улыбка
Вот только у меня теперь вопрос возник, а нужно ли эти 2 поля теперь? все равно есть табличка с юзерами где есть поле с оценкой. Ведь rate_loc хранит всего лишь кол-во этих юзеров оставивших оценку...

В общем нуно подумать...


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
Мелкий Супермодератор
Отправлено: 01 Июля, 2014 - 09:47:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




LIME пишет:
а что если вычисленное поле округлить до целого в меньшую сторону

Можно и round((rate_sum_loc/rate_loc)*100) сделать. Для двух знаков после мнимой запятой хватит даже tinyint'а.
Ну и пределы условия тоже на 100 домножить.

Viper пишет:
Вот только у меня теперь вопрос возник, а нужно ли эти 2 поля теперь?

Если это кешированная цифра, чтобы не считать каждый раз юзеров заново, то лучше удалить.
Впрочем, rate_loc обычно выводится рядом со средней оценкой для наглядности.


-----
PostgreSQL DBA
 
 Top
LIME
Отправлено: 01 Июля, 2014 - 10:49:44
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Мелкий пишет:
Можно и round((rate_sum_loc/rate_loc)*100) сделать.
а зачем?
достаточно округлить до пола и проверять на var1 <= floor < var2
(Добавление)
хотя зависит от условий
непонятно включать границы можно-ли
 
 Top
Мелкий Супермодератор
Отправлено: 01 Июля, 2014 - 10:54:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




LIME, да, зависит от условий.
Я чаще вижу средние баллы дробные, какие-нибудь 8,6 или 8,34 и не припоминаю округлённые до целых. Такие дроби можно хранить как целочисленные (хм, вкурил, что про влезание в tinyint обманываю Ниндзя ) именно потому, что с интом несколько удобнее работать и только на выводе делать дробь.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Хранение данных, их вывод и обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB