Mysql
根據列值限制結果組
我不確定我是否正確地提出了這個問題,但無論如何。
我有一個帶有 2 級註釋的表,其中一些註釋具有相同的
comment_parent
列值。如何進行SELECT
查詢,將相同行的結果限制為comment_parent
5?這樣我就不會總共得到 5 條評論,而是為每組具有相同comment_parent
值的評論獲得 5 條評論?我在這里和 SO 上發現了很多(某種)類似的問題,但是所有這些情況都以某種方式不同,或者我只是無法從那裡“投射”到我的案例的答案。因此,如果您認為這只是另一個重複,請原諒我。我真的很想為我的案子準確地找到答案。
表格樣本:
CREATE TABLE `level_2` ( `id` int(11) NOT NULL, `comment_id` int(11) DEFAULT NULL, `comment_parent` int(11) DEFAULT NULL, `user_id` int(11) DEFAULT NULL, `user_name` varchar(256) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `user_photo` varchar(2083) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `url` varchar(2083) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `comment_text` varchar(16834) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL, `comment_date` timestamp NULL DEFAULT NULL )
數據樣本:
INSERT INTO `level_2` (`id`, `comment_id`, `comment_parent`, `user_id`, `user_name`, `user_photo`, `url`, `comment_text`, `comment_date`) VALUES (1, 270, 269, 11223344, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-22 04:04:45'), (2, 271, 269, 22334455, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52'), (3, 272, 269, 33445566, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52'), (4, 273, 269, 11111111, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52'), (5, 274, 269, 22222222, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-22 04:04:45'), (6, 275, 269, 11111111, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52'), (7, 276, 269, 22222222, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52'), (8, 280, 268, 35990230, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52'), (9, 281, 268, 35990230, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-22 04:04:45'), (10, 282, 278, 35990230, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52');
到目前為止我的查詢:
SELECT * FROM level_2 LIMIT 5
我得到的輸出(大致):
(`id`, `comment_id`, `comment_parent`, `user_id`, `user_name`, `user_photo`, `url`, `comment_text`, `comment_date`) VALUES (1, 270, 269, 11223344, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-22 04:04:45'), (2, 271, 269, 22334455, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52'), (3, 272, 269, 33445566, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52'), (4, 273, 269, 11111111, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52'), (5, 274, 269, 22222222, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-22 04:04:45');
我想得到的輸出(大致):
(`id`, `comment_id`, `comment_parent`, `user_id`, `user_name`, `user_photo`, `url`, `comment_text`, `comment_date`) VALUES (1, 270, 269, 11223344, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-22 04:04:45'), (2, 271, 269, 22334455, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52'), (3, 272, 269, 33445566, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52'), (4, 273, 269, 11111111, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52'), (5, 274, 269, 22222222, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-22 04:04:45'), (8, 280, 268, 35990230, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52'), (9, 281, 268, 35990230, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-22 04:04:45'), (10, 282, 278, 35990230, 'Username', '/userpic.jpg', '/example_page', 'sample text', '2019-02-27 12:27:52');
我無法測試它,因為線上小提琴沒有最新版本,但如果您使用的是 MySQL 8.0.14,您可以嘗試使用LATERAL連接:
SELECT * FROM (SELECT DISTINCT comment_parent FROM level_2) cp, LATERAL (SELECT * FROM level_2 WHERE comment_parent = cp.comment_parent LIMIT 5) l2 ;
如果沒有,您可以嘗試使用 ROW_NUMBER:
WITH CT AS ( SELECT *, row_number() OVER (PARTITION BY comment_parent) rn FROM level_2 ) SELECT * FROM CT JOIN (SELECT DISTINCT comment_parent FROM level_2 LIMIT 5) cp ON CT.comment_parent = cp.comment_parent WHERE rn <=5 ;
編號 | 評論 ID | 評論父 | 使用者 ID | 使用者名 | 使用者照片 | 網址 | 評論文本 | 評論日期 | rn | 評論父 -: | ---------: | -------------: | -------: | :-------- | :----------- | :------------ | :----------- | :------------------ | -: | -------------: 8 | 280 | 268 | 35990230 | 使用者名 | /userpic.jpg | /example_page | 範例文本 | 2019-02-27 12:27:52 | 1 | 268 9 | 281 | 268 | 35990230 | 使用者名 | /userpic.jpg | /example_page | 範例文本 | 2019-02-22 04:04:45 | 2 | 268 1 | 270 | 269 | 11223344 | 使用者名 | /userpic.jpg | /example_page | 範例文本 | 2019-02-22 04:04:45 | 1 | 269 2 | 271 | 269 | 22334455 | 使用者名 | /userpic.jpg | /example_page | 範例文本 | 2019-02-27 12:27:52 | 2 | 269 3 | 272 | 269 | 33445566 | 使用者名 | /userpic.jpg | /example_page | 範例文本 | 2019-02-27 12:27:52 | 3 | 269 4 | 273 | 269 | 11111111 | 使用者名 | /userpic.jpg | /example_page | 範例文本 | 2019-02-27 12:27:52 | 4 | 269 5 | 274 | 269 | 22222222 | 使用者名 | /userpic.jpg | /example_page | 範例文本 | 2019-02-22 04:04:45 | 5 | 269 10 | 282 | 278 | 35990230 | 使用者名 | /userpic.jpg | /example_page | 範例文本 | 2019-02-27 12:27:52 | 1 | 278
db<>在這裡擺弄