반응형
탁자:
(`post_id`, `forum_id`, `topic_id`, `post_time`)
(79, 8, 4, '2012-11-19 06:58:08');
(80, 3, 3, '2012-11-19 06:58:42'),
(81, 9, 9, '2012-11-19 06:59:04'),
(82, 11, 6, '2012-11-19 16:05:39'),
(83, 9, 9, '2012-11-19 16:07:46'),
(84, 9, 11, '2012-11-19 16:09:33'),
쿼리 :
SELECT post_id, forum_id, topic_id FROM posts
GROUP BY topic_id
ORDER BY post_time DESC
LIMIT 5
결과 :
[0] => [post_id] => 84 [forum_id] => 9 [topic_id] => 11
[1] => [post_id] => 82 [forum_id] => 11 [topic_id] => 6
[2] => [post_id] => 81 [forum_id] => 9 [topic_id] => 9
[3] => [post_id] => 80 [forum_id] => 3 [topic_id] => 3
[4] => [post_id] => 79 [forum_id] => 8 [topic_id] => 4
문제 :
post_id-> 81 대신 post_id-> 83을 반환하도록 쿼리를 다시 작성하는 방법은 무엇입니까?
둘 다 동일한 포럼 및 주제 ID를 갖지만 post_id-> 81은 post_id-> 83보다 오래된 날짜입니다.
그러나 Group By는 '최신'레코드가 아닌 '첫 번째'레코드를 얻는 것 같습니다.
나는 쿼리를
SELECT post_id, forum_id, topic_id, MAX(post_time)
하지만 post_id 81과 83을 모두 반환합니다.
해결 방법
group 절에 사용되지 않고 집계되지 않은 속성을 선택하면 결과가 지정되지 않습니다. 즉 다른 속성이 어떤 행에서 선택되었는지 알 수 없습니다. (SQL 표준은 이러한 쿼리를 허용하지 않지만 MySQL은 더 완화됩니다.)
그런 다음 쿼리를 작성해야합니다. 같이
SELECT post_id, forum_id, topic_id
FROM posts p
WHERE post_time =
(SELECT max(post_time) FROM posts p2
WHERE p2.topic_id = p.topic_id
AND p2.forum_id = p.forum_id)
GROUP BY forum_id, topic_id, post_id
ORDER BY post_time DESC
LIMIT 5;
또는
SELECT post_id, forum_id, topic_id FROM posts
NATURAL JOIN
(SELECT forum_id, topic_id, max(post_time) AS post_time
FROM posts
GROUP BY forum_id, topic_id) p
ORDER BY post_time
LIMIT 5;
참조 페이지 https://stackoverflow.com/questions/13459516
반응형
'MySql' 카테고리의 다른 글
MySQL Fixing broken UTF-8 encoding (0) | 2021.01.19 |
---|---|
MySQL 날짜와 함께보다 큼 연산자를 사용하는 방법은 무엇입니까? (0) | 2021.01.19 |
MySQL DATETIME 지난 2 시간 동안 행 선택 (0) | 2021.01.19 |
MySQL DELIMITER // 트리거에서 무엇을합니까? (0) | 2021.01.19 |
MySQL 중복 키 업데이트에 대한 업데이트 (0) | 2021.01.19 |
댓글