Mysql

根據列值限制結果組

  • March 1, 2019

我不確定我是否正確地提出了這個問題,但無論如何。

我有一個帶有 2 級註釋的表,其中一些註釋具有相同的comment_parent列值。如何進行SELECT查詢,將相同行的結果限制為comment_parent5?這樣我就不會總共得到 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<>在這裡擺弄

引用自:https://dba.stackexchange.com/questions/230983