Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MySQL подсчет уникальных голосов, избавиться от накрутчиков голосов поздно 
:(
    Опции темы
Leshak
Дата 11.1.2009, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



наступил Кризис в мышлении - Помогите!

Проблема такая - итоги голосования пишутся в таблицу с полями
project, remote_addr, mark (оценка)

некоторые особо Талантливые участники (или их болельщики) голосуют за своих и против чужих по нескольку десятков раз.

решать это на уровне  фильтрации адресов и куков уже поздно, а фильтровать вручную пока рано 

Код

# список лидеров ГРЯЗНЫЙ
SELECT project, COUNT(project), AVG(mark) AS avg_mark FROM vote GROUP BY project ORDER BY avg_mark DESC ;

# список НаКрутчиков
SELECT project, COUNT(remote_addr) AS count_remote_addr, AVG(mark) AS avg_mark, SUM(mark), remote_addr FROM vote GROUP BY  project, remote_addr ORDER BY count_remote_addr DESC ;



это Скучно - хочется Грамотного запроса! 
чтобы в результате иметь за какой проект сколько отдано уникальных голосов со средней оценкой и сколько накрученных (со средней оценкой)

PM MAIL   Вверх
Bose
Дата 11.1.2009, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: нет
Всего: 51



Может так?
Код

SELECT project, COUNT(project), AVG(mark) AS avg_mark FROM vote GROUP BY project HAVING COUNT(remote_addr)=1 ORDER BY avg_mark DESC ;

PM MAIL WWW Skype   Вверх
Leshak
Дата 11.1.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



Цитата(Bose @  11.1.2009,  17:49 Найти цитируемый пост)
Может так?


увы - нет :(
так получаем только тех, за кого отдан только 1 голос
PM MAIL   Вверх
skyboy
Дата 11.1.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



отложим пока в сторону тот вопрс, что с одного remote_addr могут выходить в сеть несколько человек. как и то, что за физически одним компьютером могут работать несколько человек.
Leshak, надо объяснить, какую логику ты хочешь получить:
1. не учитывать голоса, если повторений значения в remote_addr более одного("игнорировать накрутчиков")
2. голос за каждый project от каждого remote_addr считать только один раз("игнорировать повторы")
3. от каждого remote_addr за каждый project учитывается только минимальная оценка(ну, это скорее для демонстрации того, что логика учета повторов может быть разной).
что тебе ближе?
PM MAIL   Вверх
Leshak
Дата 11.1.2009, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



Цитата(skyboy @  11.1.2009,  18:41 Найти цитируемый пост)
Leshak, надо объяснить, какую логику ты хочешь получить:


хотел в результате иметь за какой проект сколько отдано уникальных голосов со средней оценкой и сколько накрученных (со средней оценкой), но уже понял - подход неверен. лучше было бы иметь количество уникальных голосов с их суммой, и количество накрученных, с их суммой... и уже потом - разницу и результат, но такое одним запросом видимо не делается...

из предложенных вариантов логики, более верным кажется
Цитата
2. голос за каждый project от каждого remote_addr считать только один раз("игнорировать повторы")

но с поправкой - 1 голос от 1 remote_addr за 1 сутки

простите великодушно, есть в таблице еще поля
data_time  - формат  2008-12-23 15:58:10
cookie        - bigint(20)
  ( Талантливые накрутчики сбрасывают cookie за 2 минуты )

Согласен с тем, что у разных пользователей одной "домашней" сетки один адрес, но как быть?
очень не хочется фильтровать вручную...  жалко время и глаза
PM MAIL   Вверх
Bose
Дата 11.1.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: нет
Всего: 51



Цитата(Leshak @  11.1.2009,  18:04 Найти цитируемый пост)
увы - нет :(
так получаем только тех, за кого отдан только 1 голос 

Да, точно. smile 
PM MAIL WWW Skype   Вверх
Deniz
Дата 12.1.2009, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Цитата(Leshak @  11.1.2009,  22:02 Найти цитируемый пост)
лучше было бы иметь количество уникальных голосов с их суммой, и количество накрученных, с их суммой.
ну с количеством проблем нет, достаточно написать:
Код
select project, data_time, count(distinct remote_addr), count(remote_addr) from ... group by project, data_time
data_time привести к дате (не знаю как это в MySQL делается), а вот с суммой есть вопрос, какую оценку выбирать? max, min, first, last?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Leshak
Дата 12.1.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



Цитата(Deniz @  12.1.2009,  08:06 Найти цитируемый пост)
ну с количеством проблем нет, достаточно написать:
... count(distinct remote_addr)....

вот Оно!!  Спасибо!

Цитата(Deniz @  12.1.2009,  08:06 Найти цитируемый пост)
а вот с суммой есть вопрос, какую оценку выбирать? max, min, first, last?


вообще-то я добрый и готов принять max, но сильно торможу, как отдельно считать сумму для уникальных и грязных голосов в одном запросе???

PM MAIL   Вверх
Deniz
Дата 13.1.2009, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Не силен в MySQL, поэтому ... select from select может помочь
Код

select v.project, v.data_time,
  count(distinct v.remote_addr), avg(a.max_mark), -- реальные
  count(v.remote_addr), avg(v.mark) -- накрутка
from 
  ( select project, data_time, remote_addr, max(mark) as max_mark from vote group by project, data_time, remote_addr ) a
  join vote v on (a.project=v.project) and (a.data_time = v.data_time) and (a.remote_addr = v.remote_addr)
group by v.project, v.data_time
может как-то так, не уверен в правильности.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Leshak
Дата 13.1.2009, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 19.10.2005

Репутация: нет
Всего: нет



Цитата(Deniz @  13.1.2009,  09:05 Найти цитируемый пост)
Не силен в MySQL, поэтому ... select from select может помочь


Увы - моя версия MySQL не поддерживает вложенные select 

пришлось решать задачу через... ну вобщем Access - перегнать туда данные таблицы и последовательными запросами фильтровать накрутку и подсчитывать результат...

другое решение -  с помощью PHP буду делать к следующему разу
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0491 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.