Страница 1 из 1

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

СообщениеДобавлено: 07 окт 2018, 12:52
Woolf
Делаю я тут турниры. Хочу сделать одним из вариантов турнира - общий вес трех крупнейших пойманных игроком рыб.

Есть такая табличка пойманной рыбы в турнире
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


Изображение

А как мне учесть не всю пойманную рыбу, а только три самые крупные из них и сформировать подобную табличку победителей?

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

СообщениеДобавлено: 08 окт 2018, 09:57
Friend123
Не оно? Не суммируем вес, лимитом отделяем 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

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

СообщениеДобавлено: 09 окт 2018, 07:25
Woolf
Нет конечно, не оно. Этот лимит установит только лимит рекордсменов

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

СообщениеДобавлено: 09 окт 2018, 08:16
Friend123
Woolf писал(а):Нет конечно, не оно. Этот лимит установит только лимит рекордсменов

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

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

СообщениеДобавлено: 10 окт 2018, 02:07
Woolf
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

Это, конечно, можно сделать процедурой, но что-то не хочется..

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

СообщениеДобавлено: 10 окт 2018, 09:51
Tolking
в fishtrap добавь поле "ном" сортируй ее по ловцу и весу и ном чтобы соответствовали 1 - самая большая у ловца и в порядке убывания (перенумерацию на стадии добавления записи можно делать) а потом в запросе турнира ограничь ном<3

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

СообщениеДобавлено: 10 окт 2018, 16:10
Friend123
Очень интересная задача, вот рабочий запрос (правда в рамках таблицы 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
 

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

СообщениеДобавлено: 10 окт 2018, 23:10
jetyb
Синтаксис:
Используется 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
 

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

СообщениеДобавлено: 11 окт 2018, 07:23
Woolf
Это действительно работает, спасибо. Правда, очень долгий запрос выходит, надо будет с индексами покопаться.