@Tannenfels

Как получить все последние комментарии для всех пользователей?

Допустим, есть две таблицы, users и comments, в comments, помимо прочих, есть столбцы user_id и created_ts (YYYY:mm:dd H:i:s).
Как я могу забрать для всех пользователей все самые последние комментарии каждого из них, причём с условием, что join'ы между таблицами users и comments недоступны?
  • Вопрос задан
  • 1101 просмотр
Решения вопроса 1
Mikhail_E
@Mikhail_E
1С, SQL
Ну если джойны не доступны только по причине того что таблицы на разных серверах, и вас (Судя по вашему варианту "Костыля" представление пользователя в виде "user_id" - вас устраивает. Думаю такой вариант будет по красивше ... (Но это не точно).

Select
CommentTable.user_id,
CommentTable.comment,
CommentTable.created_ts
From 
comments as CommentTable
Inner join 
(Select 
t.user_id as user_id ,
Max(t.created_ts) as LastTime
From comments as t
Group by t.user_id) as LastTimeTable
On CommentTable.user_id = LastTimeTable.user_id 
and CommentTable.created_ts = LastTimeTable.LastTime


Если у вас к таблице "Users" доступен select ... думаю можно попробовать сначала создать на сервере Таблицы comments временную таблицу
Что-то типа
Create table #tt1
(user_id nvarchar(10),
user_name nvarchar(100))

Insert into #tt1 
Select user_id , user_name from users

и потом джойнить временную таблицу юзерсов с таблицей которая получилась из запроса выше ... тогда будут доступны ещё и данные таблицы юзерс. (насчет оптимальности не уверен, но думаю сработает)
Итого будет типа :
Create table #tt1
(user_id nvarchar(10),
user_name nvarchar(100))

Insert into #tt1 
Select user_id , user_name from users

Select
CommentTable.user_id,
users.user_name,
CommentTable.comment,
CommentTable.created_ts
From 
comments as CommentTable
Inner join 
(Select 
t.user_id as user_id ,
Max(t.created_ts) as LastTime
From comments as t
Group by t.user_id) as LastTimeTable
On CommentTable.user_id = LastTimeTable.user_id 
and CommentTable.created_ts = LastTimeTable.LastTime
Left join #tt1 as users
on CommentTable.user_id = users.user_id

drop table #tt1
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Tannenfels Автор вопроса
Больше похоже на костыль, но, похоже, работает:

select distinct user_id,
                (select comment from comments c2 where c1.user_id=c2.user_id order by c2.created_ts desc limit 1)
from comments c1


Буду признаетелен, если кто-то представит более элегантное решение
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы