Гость
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Получить последнее Имя пользователя / 25 сообщений из 25, страница 1 из 1
26.12.2019, 07:55
    #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
26.12.2019, 11:01
    #39908320
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
Версия MySQL?
...
Рейтинг: 0 / 0
26.12.2019, 11:04
    #39908324
Tonny96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
Версия сервера: 10.1.43-MariaDB-1~xenial - mariadb.org binary distribution
Спс что отозвались)
...
Рейтинг: 0 / 0
26.12.2019, 11:19
    #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
26.12.2019, 11:28
    #39908351
Tonny96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
Нажал отправить запрос и зависло вот так...(
...
Рейтинг: 0 / 0
26.12.2019, 12:38
    #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
26.12.2019, 18:09
    #39908612
Tonny96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
Понятно что ничего не понятно.. запрос сильно сложный. Как не крути не работает
...
Рейтинг: 0 / 0
26.12.2019, 18:31
    #39908628
Tonny96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
Если бы я знал как составить я бы не спрашивал ответа на форуме.Но спасибо что хоть кто-то ответил обычно на этом форуме все воды в рот набрали. Если соизвелите помочь готовым запросом и ответить на пару логический вопросов по нему то будет здорово.
...
Рейтинг: 0 / 0
26.12.2019, 19:00
    #39908655
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
Тогда выгружайте (или воссоздавайте) структуру, делайте образец данных (10-20 записей), и выкладывайте всё это вместе с требуемым результатом для этих данных. Будем крутить...
...
Рейтинг: 0 / 0
26.12.2019, 19:11
    #39908662
Tonny96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
...
Рейтинг: 0 / 0
26.12.2019, 19:12
    #39908663
Tonny96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
...
Рейтинг: 0 / 0
26.12.2019, 19:12
    #39908664
Tonny96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
Прикрепил таблицу и требуемый результат.
...
Рейтинг: 0 / 0
26.12.2019, 20:07
    #39908703
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
Отлично.

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

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

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

По всей видимости структура базы отвратная для таких задач.. порекомендуйте как устроить базу чтоб работало все как часики.. или запрос можно как-то оптимизировать?
...
Рейтинг: 0 / 0
26.12.2019, 21:34
    #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
26.12.2019, 23:38
    #39908774
Tonny96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
Спасибо вам больше за помощь, думаю стоит оптимизировать сбор данных.
...
Рейтинг: 0 / 0
27.12.2019, 02:23
    #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
27.12.2019, 13:45
    #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
01.01.2020, 10:02
    #39910297
Tonny96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
Karbafos,

ого ваш предпоследний вариант у меня занял Запрос занял 0.3071 сек, спасибо большое.. я в mysql к сожалению не силен, но как вы думаете стоит ли мне менять структуру таблицы или текущая структура считается вполне приемлемой для получения данных которые мне нужно? Может дадите какие-то свои опытные рекомендации как бы вы ее изменили? И еще давайте попоробуем разобраться чему 1 вариант запроса у меня выполняется 131.9464 сек.?
...
Рейтинг: 0 / 0
01.01.2020, 10:46
    #39910300
Tonny96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
Последний вариант разместил в свой код, оч круто, спасибо!
...
Рейтинг: 0 / 0
01.01.2020, 13:02
    #39910306
Tonny96
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
Еще 2 вопроса интересуют:
1 - как получить все последние имена пользователей и их steamid
2 - как получить последние имена пользователей и их steamid из нескольких баз данных например из 227_2017, 331_27015, 123_27015 .. тут нужно учесть время последнего подключения игрока по полю end на любой из этих среверов.. (227_2017, 331_27015, 123_27015 ) ну и steamid не должны повторяться, берем только самые последние из баз данных.
...
Рейтинг: 0 / 0
03.01.2020, 03:41
    #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
03.01.2020, 03:59
    #39910508
Karbafos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить последнее Имя пользователя
Tonny96
Karbafos,

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


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

Первый вариант делает слишком много self join и не использует pk.
Чтобы понимать что к чему крайне рекомендую освоить конструкцию EXPLAIN и пройтись по всем вариантам, которые есть в данной теме.
...
Рейтинг: 0 / 0
03.01.2020, 04:03
    #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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Получить последнее Имя пользователя / 25 сообщений из 25, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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