PostgreSql выбрать запись с самой новой датой, и проверить есть ли такая запись в другой таблице

Я использую Python, и базу данных PostgresSql (asyncpg)

У меня есть 2 таблицы:

Таблица Users

<table>
    <tr>
        <td>user_id</td>
        <td>name</td>
        <td>photo_id</td>
        <td>last_seen</td>
    </tr>
    <tr>
        <td>3</td>
        <td>борис</td>
        <td>photo1</td>
        <td>2021-12-17 16:25:48.5594</td>
    </tr>
    <tr>
        <td>6</td>
        <td>петя</td>
        <td>photo2</td>
        <td>2021-12-17 15:18:02.368025</td>
    </tr>
    <tr>
        <td>7</td>
        <td>вася</td>
        <td>photo3</td>
        <td>2021-12-17 15:18:02.368025</td>
    </tr>
</table>

Таблица History

<table>
    <tr>
        <td>user_id</td>
        <td>name</td>
        <td>photo_id</td>
    </tr>
    <tr>
        <td>3</td>
        <td>борис</td>
        <td><span style="color: rgb(59, 64, 69); font-family: -apple-system, blinkmacsystemfont, &quot;segoe ui&quot;, &quot;liberation sans&quot;, sans-serif; font-size: 13px;">photo1</span></td>
    </tr>
    <tr>
        <td>3</td>
        <td>борис</td>
        <td><span style="color: rgb(59, 64, 69); font-family: -apple-system, blinkmacsystemfont, &quot;segoe ui&quot;, &quot;liberation sans&quot;, sans-serif; font-size: 13px;">photo2</span></td>
    </tr>
    <tr>
        <td>7</td>
        <td>вася</td>
        <td><span style="color: rgb(59, 64, 69); font-family: -apple-system, blinkmacsystemfont, &quot;segoe ui&quot;, &quot;liberation sans&quot;, sans-serif; font-size: 13px;">photo3</span></td>
    </tr>
</table>

Таблица Hisotry содержит в себе историю того, какие photo_id видел user

Моя задача состоит в том, что-бы из таблицы Users забрать photo_id с наиболее новой датой(last_seen),и проверить -> " Видел ли текущий юзер, photo_id с "наиболее новой датой" , это же я проверяю с помощью(таблицы History), Если юзер видел, тогда выбираем следующую наиболее новую дату. И так далее..

Пример ожидаемого результата: Как вы могли заметить наиболее новая дата, сейчас у юзера "Петя" . Допустим юзер "Борис" решил запросить "запись с самой новой датой". Но так как в таблице History "Борис" уже видел photo_id "Пети", то нужно взять следующую "наиболее новую запись" Следующая наиболее новая запись пренадлежит "Борису" , проверяем видел ли "Борис" photo_id "Бориса", и да, как пародоксально это бы не звучало, да видел. Тогда проверяем следующую наиболее новую запись, которая пренадлежит "Васи", проверка видел ли "Борис" photo_id Васи. -> Нет, не видел. Тогда на выходе "Борис" должен получить запись где name='Вася'

Мои попытки:

Вот-так я получаю запись с самой новой датой: sql = f"SELECT * FROM Users ORDER BY last_seen DESC LIMIT 1"

Так я проверяю, существует ли у записи с наиболее новой датой photo_id в History sql = f"SELECT EXISTS(SELECT id from history WHERE id={id} AND photo_id='{photo_id}')" - Вернет True , если есть. False - если нету.

А вот-так я беру "следующую запись с наиболее новой датой" sql = f"SELECT * FROM Users WHERE last_seen < '{newdate}' ORDER BY last_seen DESC LIMIT 1" Где {newdate} - самая новая дата

Буду безумно благодарен любой помощи!


Ответы (0 шт):