Удаление дубликатов * после * упорядочения в запросе SQL - PullRequest
0 голосов
/ 07 сентября 2018

У меня следующий запрос SQL:

select 
    id,
    name
from
    project
    inner join job on project.id = job.project_id
where
    job.user_id = 'me'
order by
    project.modified desc
limit 10

Идея состоит в том, чтобы получить информацию о 10 последних использованных проектах для данного пользователя.

Проблема в том, что это может возвращать дубликаты в случае, когда несколько заданий имеют один и тот же проект. Вместо дубликатов, я хочу упорядочить все строки на modified desc, удалить дубликаты на основе id и name, , затем ограничить до 10.

Я не смог понять, как этого добиться. Кто-нибудь может указать мне правильное направление?

Ответы [ 4 ]

0 голосов
/ 08 сентября 2018

Я получил следующее, что, кажется, работает нормально:

select
    p.id,
    p.name
from
    project p
    inner join
    (
        select
            j.id,
            max(j.modified) as max_modified
        from
            job j
        where
            t.user_id = 'me'
        group by
            j.id
        order by
            max_modified desc
        limit 10
    ) ids on p.id = ids.id
order by
    max_modified desc
0 голосов
/ 07 сентября 2018

Вы пробовали ВЫБРАТЬ ЗНАЧЕНИЕ ?

select distinct
    id,
    name
from
    project
    inner join job on project.id = job.project_id
where
    job.user_id = 'me'
order by
    project.modified desc
limit 10
0 голосов
/ 07 сентября 2018

Вы получаете дубликаты из-за объединения. Поскольку вам нужны только столбцы из таблицы проекта (я полагаю, id и name из этой таблицы), лучше не создавать дубликаты во-первых, чем удалять их после объединения:

select p.id,
       p.name
from project p
where exists (select *
              from job job
              where job.project_id = p.id
                and job.user_id = 'me')
order by p.modified desc
limit 10
0 голосов
/ 07 сентября 2018

попробуйте это, используя row_number - он будет работать на postgresql

select * from 
(select 
    id,
    name,row_number() over(partition by id,name order by modified desc) as rn
from
    project inner join job on project.id = job.project_id
where
    job.user_id = 'me')a where rn=1 order by modified desc limit 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...