Yours GROUP BYis suitable for this purpose, just attach as downloadswell COUNT(downloads.*).
http://sqlfiddle.com/#!2/6ca2b/4/0
SELECT users.*,
codes.code,
COUNT(downloads.ID)
FROM users
LEFT JOIN (codes
INNER JOIN codes_users
ON codes.id = codes_users.code_id)
ON users.id = codes_users.user_id
LEFT JOIN downloads ON
users.id = downloads.user_id
GROUP BY users.id;
GROUP BY: SQL GROUP BY , , .. COUNT() 'ed. , :
SELECT users.referer,
users.domain,
codes.code,
COUNT(downloads.ID)
FROM users
LEFT JOIN (codes
INNER JOIN codes_users
ON codes.id = codes_users.code_id)
ON users.id = codes_users.user_id
LEFT JOIN downloads ON
users.id = downloads.user_id
GROUP BY users.referer,
users.domain,
codes.code;
MySQL :
- MySQL ""
GROUP BY, , GROUP BY , , . MySQL, . . GROUP BY, MySQL, PostgreSQL , , "" . MySQL WITH ROLLUP, , . ROLLUP , . :
SELECT codes.code,
users.domain,
users.referer,
COUNT(downloads.ID)
FROM users
LEFT JOIN (codes
INNER JOIN codes_users
ON codes.id = codes_users.code_id)
ON users.id = codes_users.user_id
LEFT JOIN downloads ON
users.id = downloads.user_id
GROUP BY codes.code,
users.domain,
users.referer
WITH ROLLUP;
NULL , . ( , , NOT NULL ROLLUP, .
GROUP BY, . , (COUNT(downloads.ID) OVER (PARTITION BY domain), MySQL, , .
, :
create view v as
select users.domain,
downloads.ID,
referer,
code,
downloads.user_id
FROM users
LEFT JOIN (codes
INNER JOIN codes_users
ON codes.id = codes_users.code_id)
ON users.id = codes_users.user_id
LEFT JOIN downloads ON
users.id = downloads.user_id;
, :
select * from
(
SELECT
referer,
domain,
code,
COUNT(user_id) AS dl_for_referer
FROM v
GROUP BY referer
) group_referrer JOIN
(
SELECT
domain,
COUNT(ID) AS dl_for_domain
FROM
v
GROUP BY domain
) group_domain ON
group_referrer.domain=group_domain.domain;
. http://sqlfiddle.com/#!2/131a0/2/0