SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.06.2022 12:12:02

Zerg11
Участник
Зарегистрирован: 09.06.2022
Сообщений: 2

Правильная организация составных запросов на примере

Добрый день.
Уже довольно долго бьюсь над одним запросом, но пока желаемого результата не достиг. Есть сомнение в правильном ли я вообще двигаюсь направлении, поэтому решил обратиться к сообществу.
Есть таблица с полями: 'sessionId', 'userId', 'time'.
Задача состоит в следующем. Необходимо выбрать для каждого уникального 'userId', все записи содержащие в себе один из двух наиболее ранних уникальных 'sessionId'.
Замудрено наверное получилось  попробую показать на примере:

Исходные данные:
https://i.postimg.cc/sXDyLZ94/input.png

Результат:
https://i.postimg.cc/1RBMPV0N/Output.png

В итоге мы избавились от записи "2|11000|08/06/2022 22:53:00" т.к. данный sessioId наиболее поздний и уже не влазит в лимит для данного userId.
Идея решения состоит в том чтобы в начале сделать выборку из уникальных userId, а уже по ним подбирать наши сессии.

WITH get_uniqueUserId AS (
SELECT DISTINCT userId
FROM tableName
)
 
SELECT DISTINCT ON (t.sessionId) t.sessionId, t.time, t.userId
FROM tableName t
INNER JOIN get_uniqueUserId
ON  get_uniqueUserId.userId = t.userId
WHERE get_uniqueUserId.userId = t.userId
ORDER BY t.sessionId, t.time
FETCH FIRST 2 ROWS ONLY


После выполнения данного запроса я получаю только две последние записи. Если брать "FETCH FIRST 2 ROWS ONLY" я получу все наборы sessioId без лимита на 2 уникальных. Буду признателен за любую помощь.

Неактивен

 

#2 09.06.2022 12:44:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Правильная организация составных запросов на примере

см https://sqlinfo.ru/articles/info/45.html
это позволит вам выбрать по 2 наиболее ранних sessionId для каждого userId
потом ещё 1 join чтобы выбрать все соответствующие имя записи

Неактивен

 

#3 09.06.2022 14:56:36

Zerg11
Участник
Зарегистрирован: 09.06.2022
Сообщений: 2

Re: Правильная организация составных запросов на примере

vasya написал:

см https://sqlinfo.ru/articles/info/45.html
это позволит вам выбрать по 2 наиболее ранних sessionId для каждого userId


select t1.sessionId
from t1
join t2
on t1.userId=t2.userId and t2.time >= t1.time
group by t1.sessionId
having count(*) <=2;
 


Из примера вроде всё правильно составил, но по-прежнему возвращает два последних sessionid для одного userId, а не каждого. Также в конструкции select я не могу указать все поля для вывода иначе возникнет ошибка
ERROR: column "t1.userId " must appear in the GROUP BY clause or be used in an aggregate function

Неактивен

 

#4 09.06.2022 19:13:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Правильная организация составных запросов на примере

Вообще-то ваш пример возвращает набор
10000
11000
14000
15000
т.е. по 2 последних sessionId для каждого userId. Просто для userId в исходных данных всего по 1 строке. См http://sqlfiddle.com/#!9/d06880/1

Но это, конечно, счастливая случайность, т.к. в статье

Предполагается, что комбинация (user_id, date_added) уникальна, т.е. пользователь не может разместить 2 сообщения в один момент времени.

Т.е. просто в лоб переписать запросы не выйдет, их нужно будет дорабатывать.

Что касается ошибки, см

Обратите внимание: в режиме ONLY_FULL_GROUP_BY придется усложнять запрос: сначала выбрать нужные post_id, затем по ним дополнительным join извлечь остальные поля (подробнее см статью Группировка в MySQL)...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson