SQL-запрос с ПОРЯДКОМ перед ГРУППОЙ?

#sql

#sql

Вопрос:

Таблица «комментарии»:

 id    post_id  data
1     1        1
2     1        2
3     2        3
4     2        4
5     3        5
6     3        6
7     4        7
8     4        8
 

Нужна таблица результатов:

 id    post_id  data
2     1        2
4     2        4
6     3        6
8     4        8
 

Итак, как вы видите, мне нужно сгруппироваться по post.id , сопоставьте последний комментарий с каждым сообщением и добавьте данные комментария.

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

1. В этом случае порядок не важен, вы можете просто использовать max для получения максимального идентификатора.

2. UPD: добавлен столбец данных

3. Какая часть вызывает у вас трудности?

Ответ №1:

 Select max(id) id,post_id
from table
group by post_id
 

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

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

2. Можете ли вы, пожалуйста, уточнить ситуацию, чтобы я мог лучше решить проблему

Ответ №2:

 SELECT  MAX(id), post_id
FROM    mytable
GROUP BY
        post_id
 

Если вам нужны столбцы, отличные от id (скажем, целая запись с наибольшим id количеством групп), используйте это:

 SELECT  m.*
FROM    (
        SELECT  DISTINCT post_id
        FROM    mytable
        ) md
JOIN    mytable m
ON      id =
        (
        SELECT  id
        FROM    mytable mi
        WHERE   mi.post_id = md.post_id
        ORDER BY
                mi.post_id DESC, mi.DESC
        LIMIT 1
        )
 

Создайте составной индекс mytable (post_id, id) , чтобы это работало быстро.

Ответ №3:

 CREATE TABLE Comments
(
  id int,
  post_id int,
  data int
)

INSERT INTO Comments
VALUES
  (1,     1 ,       1),
  (2,     1   ,     2),
  (3,     2,        3),
  (4,     2,        4),
  (5,     3,        5),
  (6,     3,        6),
  (7,     4,        7),
  (8,     4,        8)


SELECT * INTO #Comments
FROM
(
  SELECT post_id, id, data, RANK() OVER 
      (PARTITION BY c.post_id ORDER BY c.id ASC) AS Rank
  FROM Comments c
 )a

-- SELECT * FROM #Comments

SELECT  ac.post_id, ac.id, ac.data
FROM #Comments ac
INNER JOIN
(
  SELECT post_id,  Max(Rank)Rank
  FROM #Comments c
  GROUP BY post_id
)c ON c.post_id = ac.post_id AND c.Rank = ac.Rank
ORDER BY ac.post_id
 

Ответ №4:

Здесь я нашел действительно рабочий запрос:

 SELECT * FROM posts 
LEFT JOIN comments ON comments.post_id = posts.id  
WHERE comments.id = (
    SELECT MAX(c.id) 
    FROM comments as c 
    WHERE c.post_id = posts.id
) 
OR comments.id IS NULL