MySql получить первый и последний результат запроса - PullRequest
0 голосов
/ 17 апреля 2019

Я создаю несколько записей документов в базе данных, и каждый документ может иметь несколько версий. Каждая новая версия - это новая запись в базе данных. Чтобы сгруппировать версии документов вместе, я назначаю им общий уникальный идентификатор groupId.

Я пытаюсь получить из базы данных последнюю версию документа, но я также хочу, чтобы исходный документ был создан на дату:

documents table
- id
- group_id
- version
- created_at

пример записей:

id: 1, group_id: 'xyz', version: 1, created_at: date
id: 2, group_id: 'xyz', version: 2, created_at: date
id: 3, group_id: 'xyz', version: 3, created_at: date
etc...

Я думал о том, чтобы использовать либо отдельный, либо порядок, а затем добавить ограничение 1 для запроса, чтобы просто получить 1 результат:

SELECT * FROM documents 
WHERE group_id='xyz'
ORDER BY 'created_at' DESC
LIMIT 1

но как я могу также включить дату create_at исходного документа в дополнение (или вместо даты последней версии созданной_at?)

Я знаю, что могу перезапустить запрос с помощью ORDER BY 'created_at' ASC LIMIT 1, но есть ли способ сделать все это в одном запросе?

Ответы [ 5 ]

4 голосов
/ 17 апреля 2019

вы можете использовать подзапросы:

SELECT * FROM documents 
WHERE id in (
    select min(id) FROM documents WHERE group_id='xyz'
    union
    select max(id) FROM documents WHERE group_id='xyz'
)
0 голосов
/ 17 апреля 2019

Этот запрос:

select d.* 
from documents d inner join (
  select group_id, min(created_at) mindate, max(created_at) maxdate
  from documents
  group by group_id 
) g on d.group_id = g.group_id and (d.created_at in (g.mindate, g.maxdate))

дает все строки, содержащие min и max created_at для каждого group_id.Вы можете добавить любое условие, которое вам нужно, например:

where d.group_id = 'xyz'
0 голосов
/ 17 апреля 2019

Если это для одной группы, я бы пошел на:

select lastd.*,
       (select min(d2.created_at)
        from documents d2
        where d2.group_id = d.group_id
       ) as first_created_at
from (select d.*
      from documents d
      where group_id = 'xyz'
      order by created_at desc
      limit 1
     ) lastd;

В частности, это может использовать индекс для documents(group_id, created_at).

0 голосов
/ 17 апреля 2019

SELECT MIN(created_at) AS date_created, MAX(created_at) AS date_updated, group_id FROM documents WHERE group_id = 'xyz' GROUP BY group_id

0 голосов
/ 17 апреля 2019

Добавление подзапроса для запроса CREATED_AT оригинала может работать:

select id, group_id, created_at, (select min(created_at) from documents d2 where 
d2.group_id = d.group_id)
from documents d
where group_id = 'xyz'
order by created_at desc
limit 1 

Поскольку дата CREATED_AT для оригинального документа не изменяется, я мог бы предложить отменить нормализацию этих данных и добавить новый столбец ORIGINAL_CREATED_ATэто заполняется для всех новых строк.

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