Задавайте вопросы, мы ответим
Вы не зашли.
Имеется 2 таблицы.
Табличка 'pro' имеет вид:
cat char(20)
ver char(10)
sta char(14)
nazv char(30)
plat char(30)
screen char(60)
info text
avtor char(32)
ident char(10)
year char(10)
janr char(12)
kach char(9)
word char(11)
lang char(15)
artist char(25)
style char(15)
В колонку "avtor" записывается имя пользователя, который добавляет запись.
Вторая табличка 'rating':
ball int(10) - оценка
who char(20) - автор
tema char(10) - название записи
Во второй табличке 'rating' записывается рейтинг записи.
Тоесть оценка, которую дают другие пользователи...
Рейтинг по количество записей я сделал так:
SELECT avtor, COUNT(avtor) AS champ FROM pro GROUP BY avtor ORDER BY champ DESC LIMIT 5
Рейтиг по сумме баллов я сделал так:
SELECT SUM(ball), who, COUNT(who) as rati FROM rating GROUP BY who ORDER BY who DESC LIMIT 5
=======
Cледующем запросом я получаю Пятерку пользователей у кого больше всего записей в таблице 'pro'
SELECT avtor, COUNT(avtor) AS champ FROM pro GROUP BY avtor ORDER BY champ DESC LIMIT 5
while ($row = mysql_fetch_array($sql)) {
print_r($row[1]);
}
Подскажите как мне в этом запросе подключить вторую табличку 'rating' и сделать что то вроде:
COUNT(avtor) + SUM(bull), COUNT(who)
Тоесть сложить количество записей и сумму баллов каждого пользователя и потом LIMIT 5,
вывести ТОП - 5.
Неактивен
Маленький пример:
Допустим Вася зашел на сайт. Добавил новость.
Сохраняется в табличку (pro) так:
...
id | avtor | nazv
132 | Вася | Winamp
...
Потом за эту новость проголосовали Петя, Дима, Игорь
Сохраняется в табличку (rating) так:
...
ball | who | tema
3 | Вася | 132
4 | Вася | 132
1 | Вася | 132
...
Теперь мне надо подсчитать сколько статей вообще у Васи в таблице pro
и сумму всех баллов Васи в таблице rating.
В данном случаи получится так:
1 cтатья + 8 баллов = 9
Неактивен
SELECT COUNT(nazv)+SUM(ball) FROM pro LEFT JOIN rating ON who=avtor GROUP BY avtor ORDER BY 1 DESC LIMIT 5
Я вам, однако, советую как-то переделать структуру таблиц.
Хранение пользователей по именам - не очень удачное решение.
Во-первых, это перерасход ресурсов (т.к. имена пользователей обычно
больше 4 байт). Во-вторых, любые объединения таблиц по строкам будут
работать медленнее объединений по числам. Самый простой способ -
добавить, например, таблицу авторов
id INT,
author_name VARCHAR(50)
и хранить авторов по их номерам.
Неактивен
paulus, спасибо. Последую советом и переделаю
Получилось следующее:
720
44
Хотя должны быть:
49
13
Потому что у меня 2 юзера
у одного 20 тем и сумма баллов 29
У другого 4 темы и сумма балло 9
Неактивен
Думаю, для правильного подсчета одновременная выборка из двух таблиц не годится. Получается, что подсчет идет не отдельных записей в таблицах, а всевозможных пар. Как вариант - использование подзапросов.
SELECT author, (SELECT COUNT(nazv) a FROM pro where pro.author=z.author) +(SELECT SUM(ball) b FROM rating r WHERE r.who=author) r FROM pro z group by author;
Неактивен
rgbeast, Спасибо. То что нужно.
paulus и тебе тоже спасибо
Неактивен
rgbeast, интересная штука получается...
Если в таблице rating ( где пишется оценка и автор ) пусто.
То он почему то не суммуриет.
А если допустим у Васи 4 темы и один раз проголосовали за его какую нибудь тему.
То он уже в рейтинге будет.
И все нормально суммируется.
Неактивен
Да, действительно. Если нет записей, то второй SELECT дает NULL, а любая операция с NULL дает NULL.
Предлагаю использовать функцию IFNULL(), которая поможет в этой ситуации
SELECT author, IFNULL((SELECT COUNT(nazv) a FROM pro where pro.author=z.author),0) +IFNULL((SELECT SUM(ball) b FROM rating r WHERE r.who=author),0) r FROM pro z group by author;
Неактивен
rgbeast, большое спасибо!
Буду знать...
Неактивен
Приветствую rgbeast,
Проблемка тут, долго очень обрабатывается запрос (который Вы мне подсказали). Где то около 17 секунд.
Я думал может быть из за того что у меня в колонке avtor было имя автора а не его ID.
Переделал, сейчас в колонке avtor находится ID автора.
Но к сожелению это не помогло. Все равно долго обрабатывается запрос.
Вот сам запрос:
SELECT avtor, IFNULL( (SELECT COUNT( nazv ) a FROM pro WHERE pro.avtor = z.avtor ) , 0 ) + IFNULL( ( SELECT SUM( ball ) b FROM rating r WHERE r.who = avtor ) , 0 ) r FROM pro z GROUP BY avtor ORDER BY r DESC LIMIT 7
Подскажите пожалуйста, может что нибудь можно сделать?
В Базе около 800 записей.
Заранее Спасибо.
Отредактированно rkit (29.10.2007 16:17:38)
Неактивен
Можно добавить индексы к таблицам, например
ALTER TABLE pro ADD KEY(avtor);
ALTER TABLE rating ADD KEY(who);
ALTER TABLE pro ADD KEY(avtor);
Неактивен
Вчера я это пробывал. Не помогло.
Сейчас (утром) я проверил как грузица страничка.
И загрузилось она очень быстро (меньше сек)
Может вчера был загружен сервер.
Но все равно спасибо.
Неактивен