您的GROUP BY
適合您,請加入downloads
和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()
「版。
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 query that works in MySQL is rejected by 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
變量意味着所有行獨立變量的集合。 (這讓我想起,在使用ROLLUP
以避免模糊不清之前,首先應確保所有這些變量均爲NOT NULL
。
編輯:
還要求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
最好的問題在很長一段時間,不硬但所有的 「要求」。 – Mihai