MySQL хелп с запросом [решено]

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

MySQL хелп с запросом [решено]

Сообщение Woolf 07 окт 2018, 12:52

Делаю я тут турниры. Хочу сделать одним из вариантов турнира - общий вес трех крупнейших пойманных игроком рыб.

Есть такая табличка пойманной рыбы в турнире
fishtrap: shid, fishid, wgt
где shid - ID игрока, fishid - вид рыбы, wgt - её вес

Т.е. например, если я хочу составить список победителей турнира по общему весу всех выловленных я делаю такой запрос:
SELECT ftr.shid as uid, sh.name as uname, SUM(wgt) AS points
FROM fishtrap AS ftr
JOIN shadows sh ON ftr.shid=sh.id WHERE ftr.inturnir=@inturnir
GROUP BY shid ORDER BY points DESC LIMIT 30


Изображение

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

Re: MySQL хелп с запросом..

Сообщение Friend123 08 окт 2018, 09:57

Не оно? Не суммируем вес, лимитом отделяем 3 штуки, сортируем от большей к меньшей.

SELECT ftr.shid as uid, sh.name as uname, wgt AS points
FROM fishtrap AS ftr
JOIN shadows sh ON ftr.shid=sh.id WHERE ftr.inturnir=@inturnir
ORDER BY points DESC LIMIT 3
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: MySQL хелп с запросом..

Сообщение Woolf 09 окт 2018, 07:25

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

Re: MySQL хелп с запросом..

Сообщение Friend123 09 окт 2018, 08:16

Woolf писал(а):Нет конечно, не оно. Этот лимит установит только лимит рекордсменов

Можно еще раз подробнее, что должно получиться на выходе - можно прям с конкретной таблицей-примером? Составить SQL запрос сложностей нет.
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: MySQL хелп с запросом..

Сообщение Woolf 10 окт 2018, 02:07

Friend123 писал(а):
Woolf писал(а):Нет конечно, не оно. Этот лимит установит только лимит рекордсменов

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


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

Например,
Вася. Пойманы караси: 100, 121, 104, 180, 1022.
Петя. Пойманы караси: 223,80,122, 1085, 765
Коля поймал одного, но на 1900 грамм

Надо получить сумму Васи по трем его крупнейшим, т.е. 1022+180+121=1323
Сумму Пети по трем его крупнейшим: 1085+765+223=2073
Сумма Коли - 1900

Отсортировать по призовым местам, т.е. в нашем случае вывести в порядке Петя-2073, Коля 1900, Вася-1323

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

Re: MySQL хелп с запросом..

Сообщение Tolking 10 окт 2018, 09:51

в fishtrap добавь поле "ном" сортируй ее по ловцу и весу и ном чтобы соответствовали 1 - самая большая у ловца и в порядке убывания (перенумерацию на стадии добавления записи можно делать) а потом в запросе турнира ограничь ном<3
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2714
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: MySQL хелп с запросом..

Сообщение Friend123 10 окт 2018, 16:10

Очень интересная задача, вот рабочий запрос (правда в рамках таблицы fishtrap сделал, но суть думаю понятна, если дописать на присоединяемые таблицы джойнами):
Синтаксис:
Используется csharp
SELECT `shid`, SUM(`wgt`) as `rating`
FROM `fishtrap`
WHERE (
        SELECT COUNT(*) FROM `fishtrap` as `z`
        WHERE
                `z`.`shid` = `fishtrap`.`shid`
                AND
                `z`.`wgt` >= `fishtrap`.`wgt`
 
) <= 3

GROUP BY `shid`
ORDER BY `rating` DESC
 
Аватара пользователя
Friend123
Старожил
 
Сообщения: 701
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: MySQL хелп с запросом..

Сообщение jetyb 10 окт 2018, 23:10

Синтаксис:
Используется csharp
with ranked as
(
    select *,
    Row_Number() over (partitiion by shid order by wgt desc) as rank
    from fishtrap
)
select shid, sum(wgt) as score from ranked where rank <= 3
group by shid order by score desc
 
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: MySQL хелп с запросом..

Сообщение Woolf 11 окт 2018, 07:23

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


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

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

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