выбор уникальных идентификаторов из двух строк - PullRequest
0 голосов
/ 01 июня 2011

хорошо, поэтому таблица выглядит следующим образом

owner_id | creator_id | receiver_id | content | created
1        | 1          | 2           | hoho    | 2011-27-05
2        | 1          | 2           | hoho    | 2011-27-05
1        | 2          | 1           | eoeo    | 2011-28-05
2        | 2          | 1           | eoeo    | 2011-28-05
1        | 1          | 3           | aaaa    | 2011-29-05
3        | 1          | 3           | aaaa    | 2011-29-05
2        | 2          | 3           | bbbb    | 2011-30-05
3        | 2          | 3           | bbbb    | 2011-30-05

я хотел бы выбрать только последнюю запись для owner_id = 1 из каждого creator_id ИЛИ receive_id, и не важно, является ли она последней из creator_id илиreceive_id, пока это последняя запись, где уникальный creator_id или receive_id равен.

, результат должен выглядеть следующим образом

owner_id | creator_id | receiver_id | content | created
1        | 1          | 3           | aaaa    | 2011-29-05
1        | 2          | 1           | eoeo    | 2011-28-05

1 Ответ

2 голосов
/ 01 июня 2011

Начните с извлечения последней даты для каждого owner_id, creator_id:

select owner_id,
       creator_id as user_id,
       max(created) as max_created
from data
where owner_id = 1
group by owner_id, creator_id

И того же для owner_id, receive_id:

select owner_id,
       receiver_id as user_id,
       max(created) as max_created
from data
where owner_id = 1
group by owner_id, receiver_id

Затем объедините и примените максимальное значение в другой раз:

select owner_id, user_id, max(max_created) as max_created
from (
     [the first of the above]
     union all
     [the second of the above]
     ) as users
group by owner_id, user_id

Затем присоедините его к подзапросу:

select data.*
from data
join ([the union query above]) as max_dates
on max_dates.owner_id = data.owner_id
and max_dates.user_id in (data.creator_id, data.reporter_id)
and max_dates.max_created = data.created
where owner_id = 1 -- avoids scanning the whole table

Это приведет к строкам, в которых creator_id появился последним, и тем, где reporter_id появился последним.

Вы не можетеуменьшите его дальше, не удаляя допустимые строки.Предположим, что возвращаемыми парами (создатель / репортер) являются (1,2) и (2,1).Тогда обе строки будут исключены, если вы будете искать абсолютное последнее появление каждого пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...