求mysql id pid递归查询结果集方法

发布于 2022-09-11 22:57:44 字数 3321 浏览 21 评论 0

题目来源及自己的思路

现在有一张用户意见表

DROP TABLE IF EXISTS `test_user_msg`;
CREATE TABLE IF NOT EXISTS `test_user_msg` (
  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `pid` bigint(20) UNSIGNED DEFAULT NULL,
  `path` varchar(255) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '层级关系',
  `user_id` bigint(20) NOT NULL,
  `replyer_id` bigint(20) UNSIGNED DEFAULT '0' COMMENT '回复者id',
  `msg_type` tinyint(3) UNSIGNED NOT NULL DEFAULT '1' COMMENT '意见类型:1:遇到问题 2:售后咨询 3:其他建议',
  `mobile` varchar(20) CHARACTER SET utf8mb4 NOT NULL DEFAULT '' COMMENT '中国手机不带国家代码,国际手机号格式为:国家代码-手机号',
  `sendmsg` text CHARACTER SET utf8mb4 COMMENT '客户发送的内容',
  `replymsg` text CHARACTER SET utf8mb4 COMMENT '回复的内容',
  `send_time` int(10) UNSIGNED DEFAULT NULL COMMENT '发送时间',
  `reply_time` int(10) UNSIGNED DEFAULT NULL COMMENT '回复时间',
  `readstatus` tinyint(3) UNSIGNED DEFAULT '0' COMMENT '0 未读 1 已读',
  `delete_time` int(10) UNSIGNED DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `uid` (`user_id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;

填充的数据内容:

INSERT INTO `test_user_msg` (`id`, `pid`, `path`, `user_id`, `replyer_id`, `msg_type`, `mobile`, `sendmsg`, `replymsg`, `send_time`, `reply_time`, `readstatus`, `delete_time`) VALUES
(1, NULL, '', 2, 0, 1, '13611111111', '用户一说的第一句', NULL, 1570698100, NULL, 0, NULL),
(2, NULL, '', 3, 0, 1, '13222222222', '用户二说的第一句', NULL, 1570700376, NULL, 0, NULL),
(10, 9, '3-9-10', 4, 1, 1, '13333333333', '用户三说的最后一句', NULL, 1570701200, NULL, 0, NULL),
(3, NULL, '', 4, 0, 1, '13333333333', '用户三说的第一句', NULL, 1570701101, NULL, 0, NULL),
(8, 2, '1-2', 3, 1, 1, '13222222222', NULL, '客服回用户二的第一句', 1570700376, 1570700380, 0, NULL),
(9, 3, '3-9', 4, 1, 1, '13333333333', '', '客服回用户三的第一句', 1570701101, 1570701150, 1, NULL),
(4, 1, '1-4', 2, 1, 1, '13611111111', NULL, '客服回的第一句', 1570698100, 1570698150, 1, NULL),
(5, 4, '1-4-5', 2, 1, 1, '13611111111', '用户一说的第二句', NULL, 1570698200, NULL, 0, NULL),
(6, 5, '1-4-5-6', 2, 1, 1, '13611111111', NULL, '客服回的第二句', 1570698200, 1570698250, 1, NULL),
(7, 6, '1-4-5-6-7', 2, 1, 1, '13611111111', '用户一说的最后一句', NULL, 1570698300, NULL, 0, NULL);
COMMIT;

我需要得到的是,用户一和客服的对话历史,就比如
QQ截图20191011103351.png

但是现在运行查询语句

SELECT c.id
FROM
    (
        SELECT a.id,
            IF (
                FIND_IN_SET(a.pid ,@pids) > 0,

                IF (
                    length(@pids) - length(
                        REPLACE (@pids, a.pid, '')
                    ) > 1,

                IF (
                    length(@pids) - length(REPLACE(@pids, a.id, '')) > 1 ,@pids ,@pids := concat(@pids, ',', a.id)
                ) ,@pids := concat(@pids, ',', a.id)
            ),
        0
        ) AS 'plist',

    IF (
        FIND_IN_SET(a.pid ,@pids) > 0,
        @pids,
        0
    ) AS ischild
    FROM
        (
            SELECT
                r.id,
                r.pid
            FROM
                cmf_user_msg r
        ) a,
        (SELECT @pids := 1) b
    ) c
WHERE
    c.ischild != 0

之后,得到的结果只有

22222.png

求解

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

留一抹残留的笑 2022-09-18 22:57:44

很简单, select * from 表 where user_id=用户1 and replyer_id=客服N 这样就查出来你想要的了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文