Найти последние записи в таблице по FK - PullRequest
1 голос
/ 02 января 2012

Моя таблица выглядит так:

id
caseid
status

Пример данных в таблице:

1   10    open
2   10    published
3   10    reopened
4   11    open
5   11    contact
6   11    response
7   11    published

Мне нужно получить все caseid с, где последний статус был published.

Таким образом, в приведенном выше примере будет извлечено только 11 (поскольку регистр 10 будет вновь открыт позже).

Как будет выглядеть запрос?

PS

Я использую PDO с подготовленными заявлениями.

Ответы [ 4 ]

4 голосов
/ 02 января 2012
select caseid from data d1 where d1.status = 'published' 
and not exists (select * from data d2 where d1.caseid = d2. caseid
and d2.id > d1.id)

Для лучшей производительности, столбцы id и caseid должны быть проиндексированы.

3 голосов
/ 02 января 2012
select a.caseid
from
  (select max(id) as id, caseid
  from table
  group by caseid)a  --this would get the last entry for every caseid
  inner join table b on (a.id=b.id) 
where b.status = 'published' 
1 голос
/ 03 января 2012

Я добавлю еще один запрос, потому что это самый быстрый без индексов - он требует только одного последовательного сканирования таблицы. Проще и быстрее, чем запрос @ Florin.

SELECT caseid
FROM   tbl
GROUP  BY caseid
HAVING max(id) = max(CASE WHEN status = 'published' THEN id ELSE NULL END);

Однако, с правильными индексами @ Решение Элроя намного быстрее . Я действительно провел быстрый тест с похожей реальной таблицей, чтобы убедиться в этом.
Правильные индексы:

CREATE INDEX tbl_id_idx ON tbl (id);

А это частичный индекс для оптимальных результатов:

CREATE INDEX tbl_status_published_idx ON tbl (id) WHERE status = 'published';

Вам не нужны никакие другие индексы для этого запроса. В частности, дополнительный индекс на caseid не имеет смысла. Всегда учитывайте, что поддержание индекса также сопряжено с затратами, особенно если в таблице много написано.

Это, вероятно, изменится при покрытии индексов («сканирование только по индексу») в PostgreSQL 9.2. Я написал подробнее об этом в недавнем ответе на dba.SE .

Попробуйте ОБЪЯСНИТЬ АНАЛИЗ , чтобы проверить.

1 голос
/ 02 января 2012

ИЗД.

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