powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Получить последнее Имя пользователя
25 сообщений из 25, страница 1 из 1
Получить последнее Имя пользователя
    #39908272
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

SELECT @i := @i + 1 AS num, steamid, name, cmd_time FROM ( SELECT steamid, MAX(name) name, SUM(cmd_time) cmd_time FROM 227_27015 GROUP BY steamid ORDER BY 3 DESC LIMIT 0, 15 ) x, ( SELECT @i:=0) z ORDER BY 4 DESC

На картинке описал подробно суть проблемы, не могу никак сформировать запрос чтоб выводило последнее имя игрока в таблице, помогите пожалуйста.
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908320
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия MySQL?
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908324
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия сервера: 10.1.43-MariaDB-1~xenial - mariadb.org binary distribution
Спс что отозвались)
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908338
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хреново... оконные функции недоступны.

Тады вроде вот так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT @i := @i + 1 AS num, 
       steamid, 
       name, 
       cmd_time 
FROM ( SELECT t0.steamid, 
              MAX(t3.name) name, 
              SUM(t0.cmd_time) cmd_time 
       FROM 227_27015 t0
       JOIN ( SELECT t1.steamid, t1.name
              FROM 227_27015 t1
              NATURAL JOIN ( SELECT steamid, MAX(`end`) `end`
                             FROM 227_27015
                             GROUP BY steamid ) t2
            ) t3 USING (steamid)
       GROUP BY t0.steamid
       ORDER BY 3 DESC LIMIT 0, 15 ) x, 
     ( SELECT @i:=0 ) z 
ORDER BY 4 DESC
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908351
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нажал отправить запрос и зависло вот так...(
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908385
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты хоть логику-то проверил? начиная от самого внутреннего запроса... выполни сперва
Код: sql
1.
2.
3.
SELECT steamid, MAX(`end`) `end`
FROM 227_27015
GROUP BY steamid


Убедился, что не бред? тогда выполни
Код: sql
1.
2.
3.
4.
5.
SELECT t1.steamid, t1.name
FROM 227_27015 t1
NATURAL JOIN ( SELECT steamid, MAX(`end`) `end`
               FROM 227_27015
               GROUP BY steamid ) t2


И опять смотри...

И так далее.
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908612
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понятно что ничего не понятно.. запрос сильно сложный. Как не крути не работает
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908628
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если бы я знал как составить я бы не спрашивал ответа на форуме.Но спасибо что хоть кто-то ответил обычно на этом форуме все воды в рот набрали. Если соизвелите помочь готовым запросом и ответить на пару логический вопросов по нему то будет здорово.
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908655
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда выгружайте (или воссоздавайте) структуру, делайте образец данных (10-20 записей), и выкладывайте всё это вместе с требуемым результатом для этих данных. Будем крутить...
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908662
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908663
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908664
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прикрепил таблицу и требуемый результат.
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908703
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отлично.

Копирую всё это в online fiddle (именно так нужно в будущем предоставлять материалы для тестирования). Добавляю свой запрос (и предварительные отладочные шаги для отслеживания логики).

Всё работает как часики, и даёт на первый взгляд верный результат (и уж точно тут виснуть не на чем...).
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908706
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, на маленькой таблице действительно работает, но вот на уже рабочей реальной таблице при отправки запроса через phpmyadmin по центру экрана "Загрузка..." и все повисло. ( https://dropmefiles.com/YC4wZ - тут выкинул таблицу)

В базе ~25000 строк (зафиксированных сессий).
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908707
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверил на чуть меньше таблице, ответа ждал без преувеличения секунд 30))

По всей видимости структура базы отвратная для таких задач.. порекомендуйте как устроить базу чтоб работало все как часики.. или запрос можно как-то оптимизировать?
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908722
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опробовал на полном дампе дома (MySQL 8.0.18). Запросы из fiddle (записей - 25225 всего, 3538 уников) выполнились за 0,07; 0,16; 7,86 и 8,23 секунды. Система Windows 10 Pro x64, проц Е7500, 2,93 Ггц, ОЗУ 4 Гб, все влияющие настройки сервера дефолтные.

Так что с запросом проблем НЕТ. Проблемы или в сервере (MySQL, PHP или web), или в клиенте.

Ну и индексов для этого запроса можно добавить - но это рюшечки.
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908774
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо вам больше за помощь, думаю стоит оптимизировать сбор данных.
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908799
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант, который отрабатывает за 0.12с без всяких индексов на дохлой виртуалке c 1CPU 2.4ГГц, 1Гб RAM

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select @rownum:=@rownum+1 as num, fin.* from (
    select rr.steamid, rr.name, sr.cmd_time  from (
        SELECT
            @dense_rank:=if(@prev_hid=s.steamid, @dense_rank + 1, 1) as dense_rank,
            @prev_hid:=s.steamid as steamid2,
            s.*
        FROM 227_27015 s,
        (SELECT @dense_rank:=0, @prev_hid:=0) var
        HAVING dense_rank=1
        ORDER BY s.steamid, s.`end` desc
    ) rr
    inner join (
        select z.steamid, sum(z.cmd_time) as cmd_time
        from 227_27015 z
        group by z.steamid
    ) sr ON rr.steamid=sr.steamid
) fin,
(select @rownum:=0) qq
order by fin.cmd_time desc
limit 25
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39908989
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0,03с на той же виртуалке при наличии доп. индекса по steamid

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select
    p.*,
    @rownum:=@rownum+1 as num
from (
    select
        rr.newid,
        rr.steamid,
        rr.name,
        sr.cmd_time,
        rr.end,
        sr.maxnewid
    from (
        select z.steamid, sum(z.cmd_time) as cmd_time, max(z.newid) as maxnewid
        from 227_27015 z
        group by z.steamid
        order by cmd_time desc, z.steamid 
        limit 25
    ) sr
    inner join 227_27015 rr ON sr.steamid=rr.steamid
    where rr.newid=sr.maxnewid
) p,
(SELECT @rownum:=0 ) var
order by p.cmd_time desc, p.steamid
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39910297
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Karbafos,

ого ваш предпоследний вариант у меня занял Запрос занял 0.3071 сек, спасибо большое.. я в mysql к сожалению не силен, но как вы думаете стоит ли мне менять структуру таблицы или текущая структура считается вполне приемлемой для получения данных которые мне нужно? Может дадите какие-то свои опытные рекомендации как бы вы ее изменили? И еще давайте попоробуем разобраться чему 1 вариант запроса у меня выполняется 131.9464 сек.?
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39910300
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Последний вариант разместил в свой код, оч круто, спасибо!
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39910306
Tonny96
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще 2 вопроса интересуют:
1 - как получить все последние имена пользователей и их steamid
2 - как получить последние имена пользователей и их steamid из нескольких баз данных например из 227_2017, 331_27015, 123_27015 .. тут нужно учесть время последнего подключения игрока по полю end на любой из этих среверов.. (227_2017, 331_27015, 123_27015 ) ну и steamid не должны повторяться, берем только самые последние из баз данных.
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39910507
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tonny96
Последний вариант разместил в свой код, оч круто, спасибо!


Рано, ибо это не последний возможный вариант.
Наиболее оптимальный, если двигаться в эту сторону это
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select
	@rownum:=@rownum+1 as num,
    p.*
from (
    select
        rr.newid, rr.steamid, rr.name, sr.cmd_time, rr.end
    from (
        select
        	z.steamid, sum(z.cmd_time) as cmd_time, max(z.newid) as maxnewid
        from 227_27015 z
        group by z.steamid
        order by cmd_time desc, z.steamid 
        limit 0, 25
    ) sr
    inner join 227_27015 rr ON sr.maxnewid=rr.newid
) p,
(SELECT @rownum:=0 ) var
order by p.cmd_time desc, p.steamid



при этом у тебя в таблице должно быть всего два индекса: pk на newid (он есть внезапно) и второй (steamid, cmd_time)
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39910508
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tonny96
Karbafos,

ого ваш предпоследний вариант у меня занял Запрос занял 0.3071 сек, спасибо большое.. я в mysql к сожалению не силен, но как вы думаете стоит ли мне менять структуру таблицы или текущая структура считается вполне приемлемой для получения данных которые мне нужно? Может дадите какие-то свои опытные рекомендации как бы вы ее изменили? И еще давайте попоробуем разобраться чему 1 вариант запроса у меня выполняется 131.9464 сек.?


Нормальная структура, там есть всё необходимое за исключением пары индексов.
Мне не нравится использование переменной в запросе для нумерации, лучше бы это делать в коде.
Кто проектировал базу, включая схему шардирования? Все вопросы лучше задавать этому человеку, ибо, не зная полную архитектуру, можно наломать дров изменениями.

Первый вариант делает слишком много self join и не использует pk.
Чтобы понимать что к чему крайне рекомендую освоить конструкцию EXPLAIN и пройтись по всем вариантам, которые есть в данной теме.
...
Рейтинг: 0 / 0
Получить последнее Имя пользователя
    #39910509
Фотография Karbafos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tonny96
Еще 2 вопроса интересуют:
1 - как получить все последние имена пользователей и их steamid
2 - как получить последние имена пользователей и их steamid из нескольких баз данных например из 227_2017, 331_27015, 123_27015 .. тут нужно учесть время последнего подключения игрока по полю end на любой из этих среверов.. (227_2017, 331_27015, 123_27015 ) ну и steamid не должны повторяться, берем только самые последние из баз данных.


Тут уж сам пробуй, может union all поможет.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Получить последнее Имя пользователя
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]