求mysql id pid递归查询结果集方法
题目来源及自己的思路
现在有一张用户意见表
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;
我需要得到的是,用户一和客服的对话历史,就比如
但是现在运行查询语句
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
之后,得到的结果只有
求解
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
很简单, select * from 表 where user_id=用户1 and replyer_id=客服N 这样就查出来你想要的了。