Size: a a a

Сообщество Python Программистов

2020 December 28

e

eff1c in Сообщество Python Программистов
А если убрать desc из order by?
источник

A

Alexander in Сообщество Python Программистов
да весь запрос могу объяснить:

Сначала нам надо получить идентификаторы последних сообщений из всех чатов:
select max(id) as id, from_id, to_id from messages group by from_id, to_id - это не совсем точно, поскольку чат двунаправленный, но для понимания логики вполне сойдет. В идеале надо группировать по обоим направлениям (это сложнее)

Затем нам надо получить сами эти сообщения, а так же их аттрибуты, кто и кому их писал.
Для этого выполняется генеральная выборка из messages, к которой присоединяется этот самый подзапрос с максимальными ид сообщений. Поскольку он присоединяется не слева, а по правилу INNER - результаты таблицы messages, не соответствующие условию mm.id = m.id не будут учтены

Затем нам надо получить атрибуты сообщения. Можно просто дважды заджоинить таблицу юзеров и вывести их имена, но мы хотим чуть более извращенно, поэтому джоиним юзеров по полю to_id ИЛИ по полю from_id. А в самом запросе выполняем тернарную операцию для определения "направления" этого самого сообщения "К" или "ОТ" пользователя
источник

БГ

Бензофуран Гетероцик... in Сообщество Python Программистов
Бензофуран Гетероцикл
я вот так получаю практически то что надо:
SELECT CASE WHEN m.to_id = ? THEN m.from_id ELSE m.to_id END AS "interlocutor", u.name, m.text
FROM messages m
JOIN users u ON
 u.id = m.to_id OR u.id = m.from_id
WHERE m.to_id = ? OR m.from_id = ?
GROUP BY interlocutor
ORDER BY m.id DESC


Но блин, там текст не из последнего сообщения(
Но оно уже хотя бы делает почти то что надо)
источник

A

Alexander in Сообщество Python Программистов
Бензофуран Гетероцикл
Но оно уже хотя бы делает почти то что надо)
вот только не то =)
источник

БГ

Бензофуран Гетероцик... in Сообщество Python Программистов
(но я хз чем порядок фиксить)
источник

БГ

Бензофуран Гетероцик... in Сообщество Python Программистов
почему всё что я придумываю для решения проблемы сводится к вкладыванию запроса в другой запрос?
это точно нормально?
источник

A

Alexander in Сообщество Python Программистов
Бензофуран Гетероцикл
почему всё что я придумываю для решения проблемы сводится к вкладыванию запроса в другой запрос?
это точно нормально?
нет, и именно поэтому ответ про "по башке" - "да"
источник

A

Alexander in Сообщество Python Программистов
выполни EXPLAIN перед своим запросом и поймешь, почему
источник

A

Alexander in Сообщество Python Программистов
оно отвечает на какой-либо вопрос в треде?
источник

A

Alexander in Сообщество Python Программистов
в чате
источник

БГ

Бензофуран Гетероцик... in Сообщество Python Программистов
Alexander
выполни EXPLAIN перед своим запросом и поймешь, почему
скулайт умеет такое?
источник

A

Alexander in Сообщество Python Программистов
Нет, ты не задал вопрос. Ты скинул ссылку на видос
источник

A

Alexander in Сообщество Python Программистов
Где вопрос?
источник

A

Alexander in Сообщество Python Программистов
Буду считать до трех, потом будет бан за спам
источник

A

Alexander in Сообщество Python Программистов
это метавопрос из серии "посмотрите видео..."
источник

A

Alexander in Сообщество Python Программистов
лучше удали это сам
источник

A

Alexander in Сообщество Python Программистов
1
источник

A

Alexander in Сообщество Python Программистов
2
источник

БГ

Бензофуран Гетероцик... in Сообщество Python Программистов
Alexander
да весь запрос могу объяснить:

Сначала нам надо получить идентификаторы последних сообщений из всех чатов:
select max(id) as id, from_id, to_id from messages group by from_id, to_id - это не совсем точно, поскольку чат двунаправленный, но для понимания логики вполне сойдет. В идеале надо группировать по обоим направлениям (это сложнее)

Затем нам надо получить сами эти сообщения, а так же их аттрибуты, кто и кому их писал.
Для этого выполняется генеральная выборка из messages, к которой присоединяется этот самый подзапрос с максимальными ид сообщений. Поскольку он присоединяется не слева, а по правилу INNER - результаты таблицы messages, не соответствующие условию mm.id = m.id не будут учтены

Затем нам надо получить атрибуты сообщения. Можно просто дважды заджоинить таблицу юзеров и вывести их имена, но мы хотим чуть более извращенно, поэтому джоиним юзеров по полю to_id ИЛИ по полю from_id. А в самом запросе выполняем тернарную операцию для определения "направления" этого самого сообщения "К" или "ОТ" пользователя
как работает джойн по x ИЛИ y?
источник

A

Alexander in Сообщество Python Программистов
3
источник