Hoping someone may be able to assist me with what I believe is a subquery issue - that I'm unable to resolve.
I have a table that includes user referral information, referrals can be 3 tiers. For example.
Jim referred Steve
Ryan referred Jim
Stephanie referred Ryan
Mark referred Stephanie
What I'm trying to do as part of a larger query is retrieve the list of referrers for the user 'steve' So ideally the query comes back with "
To give you an idea of the 'user_referrals' table, if Steve was userid 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)
The sub query portion of the main query looks like this
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)
)
I don't think this is the best way to approach it, with the above in the main query, I've got the results as follows so far:
Sample query
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%';
Sample output
+------+----------------------------+------------------+--------+----------+----------+
| 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 |
+------+----------------------------+------------------+--------+----------+----------+
May just be that I'm confusing myself with the joins perhaps, hoping someone can offer some guidance here.
Thanking you in advance.
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)
Here is a demo table of the user_referrals table, with create code + insert demo data
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');
The output should be
UserID | Referer 1 | Referer 2 | Referer 3 | Referer 4 6211 | 6155 | 5757 | 29 | 24
I'm trying to attempt an sql query (I thought I required a sub query) to recursively go through the records to pull the required data.
mysql> select u3.referrer as referrer3,
-> u2.referrer as referrer2,
-> u1.referrer as referrer1
-> from user_referrals_demo as u1
->
-> left join user_referrals as u2 ON (u2.referee = u1.referrer)
-> left join user_referrals as u3 ON (u3.referee = u2.referrer)
-> left join user_referrals as u4 ON (u4.referee = u3.referrer)
->
-> where u1.referee = '6211';
The above sql provided the desired output that was required, with this bit of code, I was able to work it into the parent query.
Ouput
+-----------+-----------+-----------+
| referrer3 | referrer2 | referrer1 |
+-----------+-----------+-----------+
| 29 | 5757 | 6155 |
+-----------+-----------+-----------+
Appreciate the private messages on this matter that helped me resolve it.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.