简体   繁体   中英

Mysql 5.7 - how to execute multiple subqueries that need the result of the previous subquery?

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 "

  • Jim
  • Ryan
  • Stephanie
  • Mark

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.

  • as requested - adding the create table for the user_referrals and example output/desired output.
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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM