Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день, занимаюсь разработкой рейтинга.
Таблица такого плана:
create table `polls`(date datetime NOT NULL,
login varchar(20) NOT NULL,
text text NOT NULL)
ENGINE=InnoDB Default CHARSET=utf8;
когда пользователь нажимает голосовать, в таблицу добавляются его время когда он проголосовал - date, его логин - login и категорию за которую проголосовал - text, при этом запись данных для пользователя не ограниченна, он может голосовать за несколько категорий.
Задача.
Сделать выборку по каждой категории (text), подсчитывая голоса пользователей (count(login)), но выборка должна должна учитывать что пользователь не может поставить более 20 голосов за 1 категорию.
Ниже привожу запрос который я сформировал но он работает не корректно.
select text t,login l,p.sm from polls r LEFT JOIN
(select login vl, text vt, count(login) sm from polls limit 20) p on (p.vl=r.login and p.vt=r.text) group by r.text, r.login order by r.text, r.login;
Заранее, благодарю за помощь.
Отредактированно webhex (28.01.2013 12:34:45)
Неактивен
Простым запросом вы эту задачу не решите. Проще при добавлении проверять, есть ли уже у данного пользователя 20 голосов за эту категорию.
Неактивен
Добрый день, спасибо за столь быстрый ответ. По поводу проверки к базе данных я имею права только считывания. Поэтому проверять не могу.
Может быть сделать stored prucedure которая вначале делает запрос:
select text, login, count(login) from polls group by text, login order by text, login;
а потом из результата данного запроса все поля которые имеют количество больше 20, большее значение в выходной таблице меняет на 20. Возможно такое?
Либо другой вариант, при выборке из таблицы значения которые при группировке count больше 20, не считывать далее эти данные с условием совпадения логина и текста (это примерно что я хотел отобразить в том запросе который написал выше).
Спасибо, за ответы.
Неактивен
select `text` t, `login` l from `polls` group by 1,2 having count(*)<21; -- выберет только те категории и логины, где пользователь голосовал не более 20 раз
Неактивен
мне нужны те которые проголосовали более 20 раз, но в выходной таблице вместо значения большего 20 должно быть 20
Неактивен
считаете голоса тех, кто проголосовал положенное число раз.
считаете кол-во тех, кто проголосовал больше положенного, умножаете на 20 и добавляете к первому результату.
Неактивен
я хочу чтоб это было в одном запросе или stored procerdure
Неактивен
Так в stored procerdure можно делать несколько запросов.
Можно и одним, но это будет дикая конструкция с кучей вложенных подзапросов.
Неактивен
как сделать такую stored процедуру?
Неактивен
Как и любую другую
http://dev.mysql.com/doc/refman/5.5/en/ … edure.html
Не понял в чем суть последнего вопроса?
Неактивен