Соедините две таблицы, сгруппируйте по столбцам и получите все столбцы - PullRequest
0 голосов
/ 28 апреля 2018

** Обновление: вот схема: http://sqlfiddle.com/#!9/fd6447

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

Сообщений:

-------------------------------------------------------
|   post_id  | post_creator_id  |      post_title     |  
-------------------------------------------------------
|    1       |        100       |   Hello All         |
-------------------------------------------------------
|    2       |        14        |   Good morning      |  
-------------------------------------------------------
|    3       |        213       |   Lovely Day        |
-------------------------------------------------------
|    4       |        55        |   Nice Title!       |
-------------------------------------------------------

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

------------------------------------------------------------------------------
| comment_id | post_id  | commenter_id | comment_text |       date           |
------------------------------------------------------------------------------
|    8       |    1     |      98      | Hello world  |  2018-04-27 12:02:22 |
------------------------------------------------------------------------------
|    9       |    4     |      123     |    Hi all    |  2018-04-27 13:11:11 |
------------------------------------------------------------------------------
|    10      |    4     |      77      | Looking good |  2018-04-27 13:20:17 |
------------------------------------------------------------------------------
|    11      |    1     |      101     | Great idea   | 2018-04-27 14:45:15  |
------------------------------------------------------------------------------

В конечном результате я хочу получить последние комментарии (comment_text) для каждого поста и некоторую информацию о посте (post_title, post_creator_id). и дата из комментариев (не из сообщений - чтобы я мог отсортировать по дате последнего комментария) Таким образом, в приведенном выше примере, результат должен быть

-----------------------------------------------------------------------------------------------------------------------
|  comment_id | post_id | commenter_id|  comment_text  | post_creator_id  |      post_title     |       date          |
-----------------------------------------------------------------------------------------------------------------------
|     10      |   4     |     77      |  Looking good  |       55         |    Nice Title!      | 2018-04-27 13:20:17 | 
-----------------------------------------------------------------------------------------------------------------------
|     11      |   1     |    101      |   Great idea   |      100         | Hello All           | 2018-04-27 14:45:15 |
-----------------------------------------------------------------------------------------------------------------------

Итак, я могу присоединиться к сообщениям с комментариями, но я не знаю, как добавить эту дополнительную информацию (post_title и post_creator_id).

Это мой запрос:

select a.*
from comments a
join (
    select post_id, max(date_entered) as date_entered
    from comments
    group by (post_id)
    ) b on a.post_id = b.post_id and a.date_entered = b.date_entered

, что дает:

comment_id    post_id     commenter_id   comment_text         date_entered
----------- -----------   -----------   -------------------- -----------------------
   10          4              77             Looking good     2018-04-27 13:20:17.000
   11          1              101            Great idea       2018-04-27 14:45:15.000

Но мне не хватает столбцов "post_title" и "post_creator_id", и я не знаю, как мне сделать еще одно объединение, чтобы добавить их? Какой правильный синтаксис?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 29 апреля 2018

Попробуйте этот запрос

SELECT * FROM posts 
       INNER JOIN comments ON posts.post_id = comments.post_id 
WHERE  comments.comment_id IN (SELECT Max(comment_id) 
                               FROM   comments 
                               GROUP  BY post_id); 

Демо: http://www.sqlfiddle.com/#!9/fd6447/33/1

выход

+---------+-----------------+-------------+------------+---------+--------------+--------------+----------------------+
| post_id | post_creator_id | post_title  | comment_id | post_id | commenter_id | comment_text |         date         |
+---------+-----------------+-------------+------------+---------+--------------+--------------+----------------------+
|       4 |              55 | Nice Title! |         10 |       4 |           77 | Looking good | 2018-04-27T13:20:17Z |
|       1 |             100 | Hello All   |         11 |       1 |          101 | Great idea   | 2018-04-27T14:45:15Z |
+---------+-----------------+-------------+------------+---------+--------------+--------------+----------------------+
0 голосов
/ 29 апреля 2018

Вам просто нужно было присоединить таблицу posts к вашему (немного сломанному, теперь исправленному) запросу:

SQL Fiddle

Настройка схемы MySQL 5.6 :

Create table posts(
    post_id  int,
    post_creator_id int,   
  post_title  varchar(100)  
);

INSERT INTO posts VALUES (1, 100, 'Hello All');
INSERT INTO posts VALUES (2, 14,'Good morning');
INSERT INTO posts VALUES (3, 213, 'Lovely Day');
INSERT INTO posts VALUES (4, 55, 'Nice Title!');

create table comments(
    comment_id int,
    post_id int,
    commenter_id int,
    comment_text  varchar(100),
    date  datetime
);

insert into comments values (8 , 1, 98, 'Hello world', '2018-04-27 12:02:22' );
insert into comments values (9 , 4, 123, 'Hi all', '2018-04-27 13:11:11' );
insert into comments values (10 , 4, 77, 'Looking good', '2018-04-27 13:20:17' );
insert into comments values (11 , 1, 101, 'Great idea', '2018-04-27 14:45:15' );

Запрос 1 :

select a.*, p.post_title, p.post_creator_id
from comments a
join (
  select post_id, max(date) as date_entered
  from comments
  group by (post_id)
  ) b on a.post_id = b.post_id and a.date = b.date_entered
join posts p on p.post_id = b.post_id

Результаты

| comment_id | post_id | commenter_id | comment_text |                 date |  post_title | post_creator_id |
|------------|---------|--------------|--------------|----------------------|-------------|-----------------|
|         11 |       1 |          101 |   Great idea | 2018-04-27T14:45:15Z |   Hello All |             100 |
|         10 |       4 |           77 | Looking good | 2018-04-27T13:20:17Z | Nice Title! |              55 |
0 голосов
/ 28 апреля 2018

Я полагаю, что вы можете достичь этого, добавив это в свой подзапрос.

select a.*
from comments a
join (
    select post_id, max(date_entered) as date_entered, post_title, post_creator_id
    from comments
    group by (post_id)
    ) b on a.post_id = b.post_id and a.date_entered = b.date_entered
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...