lesson 22 Joins & sets · intermediate
Self-joins & referral relationships
Join a table to itself to explore relationships.
the idea
A self-join joins a table to itself under two aliases. users.referred_by_user_id points at another row of users, so joining users u to users r ON r.user_id = u.referred_by_user_id puts each user beside their referrer. LEFT JOIN keeps users who were not referred.
Dataset: Product / SaaS Analytics
The tables the challenges use, with their first 6 rows. Under each column name: the kind of value it holds, and which table it links to.
users9 columns · 11,348 rows
| user_idnumber · unique id | account_idnumber · links to accounts | full_nametext | emailtext | roletext | signup_sourcetext | referred_by_user_idnumber · links to users | created_atdate & time | deactivated_attext |
|---|---|---|---|---|---|---|---|---|
| 1 | 1 | Omar Jackson | omar.jackson@ironcapital1.example | owner | workspace_creator | NULL | 2024-01-14 18:52:14 | NULL |
| 2 | 1 | Imani Kang | imani.kang@ironcapital1.example | admin | invitation | NULL | 2024-01-24 03:43:14 | NULL |
| 3 | 1 | Chloe Mitchell | chloe.mitchell@ironcapital1.example | admin | invitation | NULL | 2024-02-02 21:34:25 | NULL |
| 4 | 1 | Jaya Carter | jaya.carter@ironcapital1.example | member | domain_join | NULL | 2024-03-31 03:39:32 | NULL |
| 5 | 1 | Zoe Turner | zoe.turner@ironcapital1.example | member | domain_join | NULL | 2024-02-12 02:53:31 | NULL |
| 6 | 2 | Esther Smith | esther.smith@vectordata2.example | owner | workspace_creator | NULL | 2024-01-15 13:21:52 | NULL |
- user_idnumber · unique id
- 1
- account_idnumber · links to accounts
- 1
- full_nametext
- Omar Jackson
- emailtext
- omar.jackson@ironcapital1.example
- roletext
- owner
- signup_sourcetext
- workspace_creator
- referred_by_user_idnumber · links to users
- NULL
- created_atdate & time
- 2024-01-14 18:52:14
- deactivated_attext
- NULL
- user_idnumber · unique id
- 2
- account_idnumber · links to accounts
- 1
- full_nametext
- Imani Kang
- emailtext
- imani.kang@ironcapital1.example
- roletext
- admin
- signup_sourcetext
- invitation
- referred_by_user_idnumber · links to users
- NULL
- created_atdate & time
- 2024-01-24 03:43:14
- deactivated_attext
- NULL
- user_idnumber · unique id
- 3
- account_idnumber · links to accounts
- 1
- full_nametext
- Chloe Mitchell
- emailtext
- chloe.mitchell@ironcapital1.example
- roletext
- admin
- signup_sourcetext
- invitation
- referred_by_user_idnumber · links to users
- NULL
- created_atdate & time
- 2024-02-02 21:34:25
- deactivated_attext
- NULL
- user_idnumber · unique id
- 4
- account_idnumber · links to accounts
- 1
- full_nametext
- Jaya Carter
- emailtext
- jaya.carter@ironcapital1.example
- roletext
- member
- signup_sourcetext
- domain_join
- referred_by_user_idnumber · links to users
- NULL
- created_atdate & time
- 2024-03-31 03:39:32
- deactivated_attext
- NULL
- user_idnumber · unique id
- 5
- account_idnumber · links to accounts
- 1
- full_nametext
- Zoe Turner
- emailtext
- zoe.turner@ironcapital1.example
- roletext
- member
- signup_sourcetext
- domain_join
- referred_by_user_idnumber · links to users
- NULL
- created_atdate & time
- 2024-02-12 02:53:31
- deactivated_attext
- NULL
- user_idnumber · unique id
- 6
- account_idnumber · links to accounts
- 2
- full_nametext
- Esther Smith
- emailtext
- esther.smith@vectordata2.example
- roletext
- owner
- signup_sourcetext
- workspace_creator
- referred_by_user_idnumber · links to users
- NULL
- created_atdate & time
- 2024-01-15 13:21:52
- deactivated_attext
- NULL
first 6 of 11,348 rows · your queries use all of them
worked example
Run these steps in order to see the idea before you write your own query. The step marked “the pattern” is what the challenges ask for. Running the example does not count toward progress.
See who referred whom. Run this. referred_by_user_id points at another row in the same users table.
step-1.sqlSELECT user_id, account_id, referred_by_user_id FROM users WHERE referred_by_user_id IS NOT NULL LIMIT 10;
Self-join to show referrer names. Run this. Alias u for the user and r for the referrer row matched on user_id.the pattern
example.sqlSELECT u.user_id, u.full_name, r.full_name AS referred_by FROM users u JOIN users r ON r.user_id = u.referred_by_user_id LIMIT 10;
common mistake
Without distinct aliases the column names are ambiguous, and an inner self-join drops everyone without a referrer.