I have a table structure similar to this:
users
| id | name | |----|--------| | 1 | jane | | 2 | john |
client
| id | name | user_id | |----|------------|---------| | 1 | client 1 | 2 | | 2 | client 2 | 2 | | 3 | client 3 | 2 | | 4 | client 4 | 1 | | 5 | client 5 | 1 |
products
| id | name | user_id | |----|------------|---------| | 1 | product 1 | 1 | | 2 | product 2 | 1 | | 3 | product 3 | 1 | | 4 | product 4 | 2 | | 5 | product 5 | 2 |
and I also created two views
client_total
SELECT user_id, COUNT(id) AS client_total FROM client GROUP BY user_id
| user_id | client_total | |---------|--------------| | 1 | 2 | | 2 | 3 |
products_total
SELECT user_id, COUNT(id) AS products_total FROM products GROUP BY user_id
| user_id |products_total| |---------|--------------| | 1 | 3 | | 2 | 2 |
and that was a result
SELECT
    users.*,
    client_total.client_total,
    products_total.products_total
FROM
    users
LEFT JOIN client_total   ON users.user_id = client_total.user_id
LEFT JOIN products_total ON users.user_id = products_total.user_id
| id | name |products_total| client_total | |----|--------|--------------|--------------| | 1 | jane | 3 | 2 | | 2 | john | 2 | 3 |
My question is:
Can I get this same result without using these two views?
Advertisement
Answer
GROUP BY in derived tables (the subqueries), before you LEFT JOIN:
SELECT
    u.id,
    u.name,
    c.client_total,
    p.products_total
FROM users u
LEFT JOIN
   (SELECT user_id, COUNT(id) AS client_total FROM client GROUP BY user_id) c
    ON u.id = c.user_id
LEFT JOIN
   (SELECT user_id, COUNT(id) AS products_total FROM products GROUP BY user_id) p
    ON u.id = p.user_id
(Doesn’t even some people call these derived tables inline views?)