#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