Поиск в MySQL полей с максимальной суммой

0139

Guest
Поиск в MySQL полей с максимальной суммой

Существует таблица (матрица) 1000 записей x 1000 полей.

Задача: Выбрать из таблицы, скажем, несколько полей с максимальной суммой.

Какой должна быть строка запроса к БД. (MySQL)?

Использовал SUM(), MAX().
 

si

Administrator
Re: Поиск в MySQL полей с максимальной суммой

Автор оригинала: 0139
Существует таблица (матрица) 1000 записей x 1000 полей.
Задача: Выбрать из таблицы, скажем, несколько полей с максимальной суммой.
Какой должна быть строка запроса к БД. (MySQL)?
Использовал SUM(), MAX().
1000 полей для 1 таблицы перебор, почитайте что-нибудь про базы данных
 

0139

Guest
Re: Re: Поиск в MySQL полей с максимальной суммой

Автор оригинала: si
1000 полей для 1 таблицы перебор, почитайте что-нибудь про базы данных
Так вот не нашел ничего про это. Ну ладно пусть будет 10 таблиц по 100 полей.

Но всеже, как ??
 

mahoune

Guest
Re: Re: Re: Поиск в MySQL полей с максимальной суммой

Автор оригинала: 0139
Так вот не нашел ничего про это. Ну ладно пусть будет 10 таблиц по 100 полей.
Но всеже, как ??
Дело в том, что раз ты собираешься сравнить несколько полей между собой следовательно эти данные можно организовать не gj горизонтали а вертикали, т.е. перевести поля в записи в таблице.

И в этом случае делают так!
TABLE - Users
USER_ID, USER_NAME
___1___ __Ivanov__
___2___ __Petrov__
___3___ __Sidorov__
___4___ __Anonim__

TABLE - GameScores
USER_ID, USER_OPPONENT, GAME_DATE, GAME_SCORE
___1___ ______2______ 01.01.2002 ____10____
___1___ ______3______ 02.02.2002 ____20____
___2___ ______1______ 01.01.2002 ____10____
___3___ ______1______ 02.02.2002 ____20____
___4___ ______3______ 02.03.2002 ____50____
___3___ ______4______ 02.03.2002 ____50____

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

0139

Guest
Re: Re: Re: Re: Поиск в MySQL полей с максимальной суммой

Автор оригинала: mahoune
Дело в том, что раз ты собираешься сравнить несколько полей между собой следовательно эти данные можно организовать не gj горизонтали а вертикали, т.е. перевести поля в записи в таблице.
И в этом случае делают так!
TABLE - Users
USER_ID, USER_NAME
___1___ __Ivanov__
___2___ __Petrov__
___3___ __Sidorov__
___4___ __Anonim__
TABLE - GameScores
USER_ID, USER_OPPONENT, GAME_DATE, GAME_SCORE
___1___ ______2______ 01.01.2002 ____10____
___1___ ______3______ 02.02.2002 ____20____
___2___ ______1______ 01.01.2002 ____10____
___3___ ______1______ 02.02.2002 ____20____
___4___ ______3______ 02.03.2002 ____50____
___3___ ______4______ 02.03.2002 ____50____
Тут ты и выбираешь MAX(GAME_SCORE) а иначе тебе пришлось-бы строить таблицу с записью на каждого пользователя и с количеством полей для всех остальных пользователей. Что существенно больше места занимает и менее динамично.
Структура такая:

USER_ID __ W1 __ W4 __ W3 __ W7 __ W9 __ W91 __
___1______10____7_____3____0_____0____4_____
___3______0_____5_____9____1_____7____1_____
___8______10____6_____2____10____1____9_____
........................................................................................
__2071____9_____3_____0____4_____3____3_____


W1 ... W100 - соответственно work_1 ... work_100

Таким образом я должен хранить информацию о том,
за какую работу пользователь id=1084 голосовал и сколько поставил ей баллов. И так на всех пользователей.

Потом я хочу по этой таблице построить список лучших 5 работ. Т.е. нужно использовать SUM()
 

Сытник

Guest
Re: Re: Re: Re: Re: Поиск в MySQL полей с максимальной суммой

Автор оригинала: 0139
Структура такая:
USER_ID __ W1 __ W4 __ W3 __ W7 __ W9 __ W91 __
___1______10____7_____3____0_____0____4_____
___3______0_____5_____9____1_____7____1_____
___8______10____6_____2____10____1____9_____
........................................................................................
__2071____9_____3_____0____4_____3____3_____
W1 ... W100 - соответственно work_1 ... work_100
Таким образом я должен хранить информацию о том,
за какую работу пользователь id=1084 голосовал и сколько поставил ей баллов. И так на всех пользователей.
Потом я хочу по этой таблице построить список лучших 5 работ. Т.е. нужно использовать SUM()
лучшая работа - это не по сумме баллов, а по среднему баллу...
 

0139

Guest
Re: Re: Re: Re: Re: Re: Поиск в MySQL полей с максимальной суммой

Автор оригинала: Сытник
лучшая работа - это не по сумме баллов, а по среднему баллу...
Не в этом вопрос.

Но всеже, за работу номер 4 проголосовало 200 человек и поставили по какому-то кол-ву баллов. Получаем, скажем, в сумме 1800. Делим на кол-во голосовавших: 1800/200 средний получается 9.

За работу номер 7 проголосовало 4 человека, и поставили в сумме 38. Делим 38/4=10. Средний бал = 9,5.

За работу номер 12 проголосовал 1 человек. Сумма голосов = 10. Вычисляем: 10/1=10. Ср. бал = 10.

Получаем лучшие три работы:
1. Работа №12
2. Работа №7
3. Работа №4

Потом за работу номер 12 проголосовало еще 2 человека и поставили 7 и 8 баллов. Сумма: 10+7+8=25.
Ср. бал: 25/3= 8.3

Теперь топ выглядит так.
1. Работа №7
2. Работа №4
3. Работа №12

Из-за двух голосов(причем не низких) вылетаем в самый низ? А что если они были-бы 1 и 1? Средний бал стал-бы равен 4?

А потом добавилась новая работа № 26. Друг автора поставил ей 10 баллов. Средний бал: 10/1=10.

Теперь топ таков:
1. Работа №26
2. Работа №7
3. Работа №4


И все эти изменения из-за трех проголосовавших!!!

Тут нужен другой алгоритм.
 

f1

formula 1
для начала нужна другая структура таблицы


USER_ID WorkId Mark

а вот из неё уже получится и выбирать
считать и сравнивать
 

0139

Guest
Автор оригинала: f1
для начала нужна другая структура таблицы
USER_ID WorkId Mark
а вот из неё уже получится и выбирать
считать и сравнивать
Какое время потребуется для обработки таблицы с 10.000.000 (десять миллионов) записями?
 

f1

formula 1
Автор оригинала: 0139
Какое время потребуется для обработки таблицы с 10.000.000 (десять миллионов) записями?
смотря что значит обработка?
а также каковы данные, используются ли индексы,
и т.д.
 

0139

Guest
Автор оригинала: f1
смотря что значит обработка?
а также каковы данные, используются ли индексы,
и т.д.
Найти, скажем 3, самых больших по сумме голосов работы.
 

chira

Новичок
Re: Re: Re: Re: Re: Поиск в MySQL полей с максимальной суммой

Автор оригинала: 0139
Структура такая:
USER_ID __ W1 __ W4 __ W3 __ W7 __ W9 __ W91 __
___1______10____7_____3____0_____0____4_____
___3______0_____5_____9____1_____7____1_____
___8______10____6_____2____10____1____9_____
........................................................................................
__2071____9_____3_____0____4_____3____3_____
W1 ... W100 - соответственно work_1 ... work_100
Таким образом я должен хранить информацию о том,
за какую работу пользователь id=1084 голосовал и сколько поставил ей баллов. И так на всех пользователей.
Потом я хочу по этой таблице построить список лучших 5 работ. Т.е. нужно использовать SUM()
Да, действительно со структурой проблемы ...

Тебе нужны три таблицы
1. Works
поля: w_id, W_name
2. Users
поля: u_id, u_name
3. Voiting
поля: u_id, w_id, mark

Определение трех лучших работ с учетом количества голосовавших:
select avg(mark) as avg_mark, count(mark), w_id
from Works w LEFT JOIN Voiting v
ON w.w_id = v.w_id
group by w.w_id
having count(mark) > 50 /* здесь принимаются во внимание только те работы , на которые отвечало больше 50 человек */
order by avg_mark DESC
limit 3
 

0139

Guest
Re: Re: Re: Re: Re: Re: Поиск в MySQL полей с максимальной суммой

Автор оригинала: chira
Да, действительно со структурой проблемы ...
Тебе нужны три таблицы
....
здесь принимаются во внимание только те работы , на которые отвечало больше 50 человек
order by avg_mark DESC
limit 3
Спасибо, попробую...
 
Сверху