【发布时间】:2021-03-10 03:30:55
【问题描述】:
希望有人能够帮助我解决我认为是子查询问题 - 我无法解决的问题。
我有一个包含用户推荐信息的表,推荐可以是 3 层。例如。
吉姆提到史蒂夫
Ryan 提到了 Jim
斯蒂芬妮提到瑞恩
马克提到斯蒂芬妮
作为更大查询的一部分,我试图做的是检索用户“史蒂夫”的推荐人列表 所以理想情况下,查询返回“
- 吉姆
- 瑞安
- 斯蒂芬妮
- 马克
让您了解“user_referrals”表,如果 Steve 的用户 ID 为 6211
--
mysql> select * from user_referrals where referee = '6211';
+------+----------+---------+----------------------------+----------------------------+------------------+---------+---------+
| id | referrer | referee | created | modified | isActualReferrer | deleted | version |
+------+----------+---------+----------------------------+----------------------------+------------------+---------+---------+
| 4934 | 6155 | 6211 | 2021-02-28 04:22:35.798832 | 2021-02-28 04:22:35.798832 | 1 | NULL | 1 |
+------+----------+---------+----------------------------+----------------------------+------------------+---------+---------+
1 row in set (0.00 sec)
mysql> select* from user_referrals where referee = '6155';
+------+----------+---------+----------------------------+----------------------------+------------------+---------+---------+
| id | referrer | referee | created | modified | isActualReferrer | deleted | version |
+------+----------+---------+----------------------------+----------------------------+------------------+---------+---------+
| 4881 | 5757 | 6155 | 2021-02-25 17:44:42.103963 | 2021-02-25 17:44:42.103963 | 1 | NULL | 1 |
+------+----------+---------+----------------------------+----------------------------+------------------+---------+---------+
1 row in set (0.00 sec)
mysql> select * from user_referrals where referee = '5757';
+------+----------+---------+----------------------------+----------------------------+------------------+---------+---------+
| id | referrer | referee | created | modified | isActualReferrer | deleted | version |
+------+----------+---------+----------------------------+----------------------------+------------------+---------+---------+
| 4589 | 29 | 5757 | 2020-12-30 05:02:23.831882 | 2020-12-30 05:02:23.831882 | 1 | NULL | 1 |
+------+----------+---------+----------------------------+----------------------------+------------------+---------+---------+
1 row in set (0.00 sec)
mysql> select * from user_referrals where referee = '29';
+----+----------+---------+----------------------------+----------------------------+------------------+---------+---------+
| id | referrer | referee | created | modified | isActualReferrer | deleted | version |
+----+----------+---------+----------------------------+----------------------------+------------------+---------+---------+
| 7 | 24 | 29 | 2019-02-02 00:22:12.000000 | 2019-02-02 00:22:12.000000 | 1 | NULL | 1 |
+----+----------+---------+----------------------------+----------------------------+------------------+---------+---------+
1 row in set (0.01 sec)
主查询的子查询部分如下所示
LEFT JOIN
( select u1.referrer from user_referrals as u1 ) as u ON (u.id = u.referrer)
LEFT JOIN
( select u1.referrer from user_referrals as u1 ) as u3 ON (u3.referrer = (
select u2.referrer from user_referrals as u2 WHERE u.referrer = u2.referee)
)
我认为这不是最好的方法,在主查询中使用上述内容,到目前为止我得到的结果如下:
示例查询
select distinct(u.id),u.created,u.first_name,p.amount,u.referrer,u3.referrer from users as u
LEFT JOIN
( Select p1.* FROM paymentledger as p1 LEFT JOIN paymentledger as p2 ON p1.userID = p2.userID AND p1.createdAt > p2.createdAt WHERE p2.userID IS NULL) as p ON (u.id = p.userID)
LEFT JOIN
( select u1.referrer from user_referrals as u1 ) as u ON (u.id = u.referrer)
LEFT JOIN
( select u1.referrer from user_referrals as u1 ) as u3 ON (u3.referrer = (
select u2.referrer from user_referrals as u2 WHERE u.referrer = u2.referee)
)
WHERE u.created LIKE '2021-02-28%';
样本输出
+------+----------------------------+------------------+--------+----------+----------+
| id | created | first_name | amount | referrer | referrer |
+------+----------------------------+------------------+--------+----------+----------+
| 6202 | 2021-02-28 00:00:12.903938 | Brian | NULL | NULL | NULL |
| 6204 | 2021-02-28 00:44:52.317175 | Katie | NULL | NULL | NULL |
| 6205 | 2021-02-28 01:28:14.379496 | Stephanie | 159.00 | NULL | NULL |
| 6206 | 2021-02-28 01:32:45.655260 | Christina | NULL | NULL | NULL |
| 6207 | 2021-02-28 01:54:22.954110 | R | NULL | NULL | NULL |
| 6208 | 2021-02-28 02:45:01.010985 | Lillie | NULL | NULL | NULL |
| 6209 | 2021-02-28 02:53:10.819064 | Deborah | NULL | NULL | NULL |
| 6210 | 2021-02-28 04:05:24.937563 | Danielle | NULL | NULL | NULL |
| 6211 | 2021-02-28 04:22:35.103951 | Linda | 159.00 | 6211 | 6155 |
| 6212 | 2021-02-28 04:32:53.045521 | Kathy | NULL | NULL | NULL |
| 6213 | 2021-02-28 05:05:17.063022 | malekmuneerah786 | NULL | NULL | NULL |
| 6214 | 2021-02-28 07:47:12.725790 | James | NULL | NULL | NULL |
| 6215 | 2021-02-28 08:10:01.976589 | Wendy | NULL | NULL | NULL |
| 6216 | 2021-02-28 08:49:09.520211 | Barbara | NULL | NULL | NULL |
| 6217 | 2021-02-28 08:53:31.673631 | Tammy | NULL | NULL | NULL |
| 6218 | 2021-02-28 09:07:59.438093 | San | NULL | NULL | NULL |
| 6219 | 2021-02-28 09:30:26.966068 | Joan R | NULL | NULL | NULL |
| 6220 | 2021-02-28 14:58:11.305224 | Moses | NULL | NULL | NULL |
| 6221 | 2021-02-28 17:26:51.210201 | De Ana | NULL | NULL | NULL |
| 6222 | 2021-02-28 17:27:25.950142 | Faisal | NULL | NULL | NULL |
| 6223 | 2021-02-28 19:25:43.374723 | Pauline | NULL | NULL | NULL |
| 6224 | 2021-02-28 19:55:34.650488 | Jana | 159.00 | 6224 | 5757 |
| 6225 | 2021-02-28 20:13:23.158743 | Authentically | NULL | NULL | NULL |
| 6226 | 2021-02-28 20:17:04.178635 | J | NULL | NULL | NULL |
| 6227 | 2021-02-28 21:49:59.988693 | JACOBINA | NULL | NULL | NULL |
| 6228 | 2021-02-28 21:59:00.075468 | Jess | NULL | NULL | NULL |
| 6229 | 2021-02-28 22:55:16.655047 | Junie | NULL | NULL | NULL |
+------+----------------------------+------------------+--------+----------+----------+
可能只是我对加入感到困惑,希望有人可以在这里提供一些指导。
提前谢谢你。
- 根据要求 - 为 user_referrals 和示例输出/期望输出添加创建表。
CREATE TABLE `user_referrals` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`referrer` int(11) DEFAULT NULL,
`referee` int(11) DEFAULT NULL,
`created` datetime(6) DEFAULT CURRENT_TIMESTAMP(6),
`modified` datetime(6) DEFAULT CURRENT_TIMESTAMP(6),
`isActualReferrer` tinyint(4) NOT NULL DEFAULT '1',
`deleted` datetime(6) DEFAULT NULL,
`version` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
);
+------+----------------------------+------------------+--------+----------+----------+----------+----------+
| id | created | first_name | amount | referrer | referrer | referrer | referrer |
+------+----------------------------+------------------+--------+----------+----------+----------+----------+
| 6210 | 2021-02-28 04:05:24.937563 | Danielle | NULL | NULL | NULL | NULL | NULL |
| 6211 | 2021-02-28 04:22:35.103951 | Linda | 159.00 | 6211 | 6155 | 5757 | 29 |
| 6212 | 2021-02-28 04:32:53.045521 | Kathy | NULL | NULL | NULL | NULL | NULL |
+------+----------------------------+------------------+--------+----------+----------+----------+----------+
27 rows in set (0.04 sec)
这里是user_referrals表的demo表,创建代码+插入demo数据
CREATE TABLE `user_referrals_demo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`referrer` int(11) DEFAULT NULL,
`referee` int(11) DEFAULT NULL,
`created` datetime(6) DEFAULT CURRENT_TIMESTAMP(6),
`modified` datetime(6) DEFAULT CURRENT_TIMESTAMP(6),
`isActualReferrer` tinyint(4) NOT NULL DEFAULT '1',
`deleted` datetime(6) DEFAULT NULL,
`version` int(11) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
);
INSERT INTO user_referrals_demo(referrer,referee) VALUES ('6155','6211'),('5757','6155'),('29','5757'),('24','29');
输出应该是
用户 ID |推荐人 1 |推荐人 2 |推荐人 3 |推荐人 4 6211 | 6155 | 5757 | 29 | 24
我正在尝试一个 sql 查询(我认为我需要一个子查询)来递归地遍历记录以提取所需的数据。
【问题讨论】:
-
minimal reproducible example How to Ask help center 我们不能剪切&粘贴&运行,这不是最小的。 PS您认为“子查询部分”是什么? (“子查询”并不意味着 JOIN 右边的东西。)为什么要显示一大段代码两次? PS 当你可以只使用表名时,为什么要使用子查询和删除列?您的标量子查询也可以是一个联接。加入研究实例。也加入语法。 PS请合理格式化代码。 PS LEFT JOIN ON 返回 INNER JOIN ON 行 UNION ALL 由 NULL 扩展的不匹配的左表行。作为 OUTER JOIN ON 的一部分,始终知道您想要什么 INNER JOIN ON。
-
以 CREATE TABLE + INSERT INTO 脚本的形式提供源数据。提供与此示例数据匹配的所需输出。
-
@philipxy - 感谢您的意见,这就是我问这个问题的原因,如果我知道您在那里提到的问题的答案,我毫不怀疑我能够解决我的问题自己的。我只是在花了 6 小时以上的研究后才在此处发布此内容,但无法弄清楚我做错了什么/我是如何错误地解决问题的。
-
在您的帖子中,您似乎试图寻求一种更简单的方法来编写工作代码。除了查询之外,您没有对您正在尝试执行的操作提供任何其他描述。你的问题到底是什么?你的问题是什么? PS 我们仍然不能剪切 & 粘贴 & 运行,您需要将输入作为代码提供输出,并且它必须是最小的,但具有代表性。 PS 请解决 cmets 中提到的所有问题。
-
好的,我以为我提供了足够的信息或更多信息,但让我尝试另一个可能有助于解释它的角度。不得不更新主票,因为我无法将附加信息/sql 项放在评论中。
标签: mysql linux subquery left-join