Соединение MYSQL — родительская и дочерняя таблицы объединяются и получают только последнюю запись из дочерней таблицы

#mysql #sql #join #greatest-n-per-group

#mysql #sql #Присоединиться #наибольшее число на группу

Вопрос:

У меня есть две таблицы сообщений и комментариев

Опубликовать таблицу

 Post_id
Post_content
  

Таблица комментариев

 comment_id
Comment
post_id
created_date
  

В одном сообщении может быть несколько комментариев или ноль комментариев

Мое требование — получение последнего комментария к сообщениям с использованием внешнего соединения слева.

Я имею в виду, что результатом должна быть одна запись для post с приведенными ниже столбцами.

 post_id,post_content ,comment_id,comment 
  

Простыми словами, сообщения должны соответствовать их последнему комментарию, если он существует.

( В настоящее время система сначала получает записи, а затем снова обращается к серверу, чтобы отобразить последние комментарии, думал получить их одним выстрелом, поскольку изначально мы показываем только один комментарий… Не уверен, каким должен быть наилучший подход, если требуется отобразить более одного комментария ..?)

Спасибо

С уважением

Kiran

Ответ №1:

 SELECT Post.post_id, post_content, comment_id, comment
FROM
    Post LEFT JOIN Comments
        ON Post.post_id = Comments.post_id
        AND created_date = (
            SELECT MAX(created_date)
            FROM Comments
            WHERE Post.post_id = Comments.post_id
        )
  

Кстати, вам следует рассмотреть возможность индексирования Comments {post_id, created_date} для оптимальной производительности, но помните о накладных расходах на индекс, не связанный с первичным ключом, в случае, если вы используете InnoDB (см. раздел «Недостатки кластеризации» в этой статье).

Комментарии:

1. Спасибо за ваш ответ. Я думал об аналогичных аналитических функциях в oracle. Но не смог найти ни одной в Mysql.

2. Также спасибо за хорошую статью 🙂 Я этого не знал.

3. @Bujji Насколько мне известно, в MySQL нет аналитических функций a-la Oracle. И добро пожаловать 🙂

4. Изменил ваш бит запроса, вместо этого в created_date я напрямую использую comment_id … поскольку идентификатор комментария max определенно является последним для этого поста. Еще раз спасибо