MySQL запрос три крупнейших

Общие вопросы о Unity3D

MySQL запрос три крупнейших

Сообщение Woolf 13 сен 2020, 00:22

Привет други, делаю турнир в игре, что-то заело меня..

Есть табличка, где складируется пойманная игроками в турнире рыба.
Выглядит примерно так

Синтаксис:
Используется csharp
CREATE TABLE `fishtrap` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `shid` bigint(20) DEFAULT NULL COMMENT 'ID игрока',
  `fishid` int(11) DEFAULT NULL,
  `wgt` int(11) DEFAULT NULL,
  `inturnir` bigint(20) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`,`inturnir`)
) ENGINE=InnoDB AUTO_INCREMENT=85365974 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
 


Нужно определить победителя турнира. Для примера, при условии турнира на "общий вес всех пойманных", я делаю запрос
Синтаксис:
Используется csharp
SELECT ftr.shid AS uid, SUM(wgt) AS points
FROM fishtrap AS ftr
WHERE ftr.inturnir=2088
GROUP BY shid ORDER BY points DESC
 


где shid - это ID игрока, а points - это его общий набранный в турнире вес.
Возникает вопрос, а как учесть не весь вес, а вес только трех/пяти крупнейших рыб, пойманных игроком? Учитывая, что он может и вовсе ни одной не поймать, и получить ноль очков..
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: MySQL запрос три крупнейших

Сообщение Woland 14 сен 2020, 12:54

Должно сработать
Синтаксис:
Используется csharp
select
shid
,shum(wgt) as sum
from
(select
shid
,wgt
,row_number() over (partition by shid order by wgt desc) as row_numb
from mytable) as t1
where row_numb<=3
group by shid
 

Если таблица большая, может занять какое-то время на выполнение
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: MySQL запрос три крупнейших

Сообщение Woolf 14 сен 2020, 16:32

это в 8м мускуле появилось.. у меня 5.5 к сожалению
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: MySQL запрос три крупнейших

Сообщение Woland 14 сен 2020, 17:23

https://www.sql-ex.ru/help/select16.php
Я пробовал, вроде вроде работает, но на моих данных как-то странно. Проверь, может у тебя норм будет.
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: MySQL запрос три крупнейших

Сообщение Woolf 14 сен 2020, 19:33

Ну вообще можно решить через курсоры, но сильно уж медленный запрос получается (
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: MySQL запрос три крупнейших

Сообщение Tolking 14 сен 2020, 20:50

Куда-то спешите?
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2714
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: MySQL запрос три крупнейших

Сообщение Woolf 15 сен 2020, 10:05

Tolking писал(а):Куда-то спешите?


Конечно же спешу. Этот запрос на определение лидеров и текущих очков должен вызываться после каждой пойманной игроками рыбы, участников турнира до 30, одновременно таких турниров может быть до 10. Т.е. чисто технически этот запрос должен выполняться 3-4 раза в секунду. И это помимо остальной работы базы.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: MySQL запрос три крупнейших

Сообщение Tolking 15 сен 2020, 11:40

Зачем так часто? Если таблица рекордов будет меняться 1 раз в 5-10 секунд никто не умрет... После каждой рыбы отправляй данные, считай для игрока новый вес, а рекорды обновляй раз в 5 секунд - любым способом можно успеть...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2714
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: MySQL запрос три крупнейших

Сообщение юnity 15 сен 2020, 14:15

Синтаксис:
Используется csharp
SELECT ftr.shid AS uid, SUM(wgt) AS points
FROM fishtrap AS ftr
WHERE ftr.inturnir=2088
GROUP BY shid ORDER BY points DESC and count = 5

может как то так? Не помню MySQL. Но count там есть точно. :ymhug:
Give exact coordinates of the decision of the problems
Аватара пользователя
юnity
UNITрон
 
Сообщения: 290
Зарегистрирован: 21 июл 2015, 18:30

Re: MySQL запрос три крупнейших

Сообщение BornFoRdeatH 15 сен 2020, 20:35

Хм... А разве не проще при вылове рыбы сразу считать по конкретному игроку данные и заносить их в таблицу, это же быстрее чем каждый раз дергать всю таблицу.Выловил игрок рыбу - занесли в одну таблицу- сразу сделали выборку по этому игроку и посчитали общий вес - дальше занесли в другую таблицу рейтинга - игрок такой-то, вес такой-то, крупшнейшая рыба айдишки-такие-то. А при показе результатов тупой запрос с сортировкой.
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: MySQL запрос три крупнейших

Сообщение Woolf 16 сен 2020, 02:00

Ну, к примеру, как посчитать общий вес трех крупнейших по конкретному игроку?
Вот в этом же и есть затык. Остальное бог с ним, можно даже выдавать результат только в конце, если динамический подсчет сильно напрягать сервак будет.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: MySQL запрос три крупнейших

Сообщение BornFoRdeatH 16 сен 2020, 09:24

Ну это ж самое простое, выбрать N максимальных значений

select *
from t
order by value desc
limit N

сумма тоже ж вроде как не сложно
select sum(value)
from t
order by value desc
limit N
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: MySQL запрос три крупнейших

Сообщение Woolf 16 сен 2020, 10:41

BornFoRdeatH писал(а):Ну это ж самое простое, выбрать N максимальных значений

select *
from t
order by value desc
limit N

сумма тоже ж вроде как не сложно
select sum(value)
from t
order by value desc
limit N


а вот и нет. Второй запрос посчитает всю сумму value, а не только N.. Первый - да, выберет то, что нужно, но сумму их не посчитает.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: MySQL запрос три крупнейших

Сообщение Woolf 16 сен 2020, 10:51

Всё, что я пока придумал, это читать результаты таким образом..

Синтаксис:
Используется csharp
SELECT ft.shid, ft.wgt
FROM fishtrap ft
WHERE ft.inturnir=2123
ORDER BY shid, ft.wgt DESC
 


Он мне выдаёт результат с отсортированным по игрокам и весам рыб результатом.
https://clip2net.com/clip/m304146/0db82 ... ?nocache=1

Мне останется только прочитать это всё на сервере и посчитать вручную суммы веса..
конечно, через жопу всё, но пока что-то иное не придумывается.
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: MySQL запрос три крупнейших

Сообщение BornFoRdeatH 16 сен 2020, 12:25

ну тогда через суб запрос, аля

select sum(x.score) from (select * from t order by value desc limit N ) as x
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

След.

Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10