[英]Select from four mysql table with count and sum columns and where clause
我的架構中有5個表格。
首先是opn
:
| opnID | submitID | emailID | opnDate | invalidOPN |
+-------+----------+---------+---------------------+------------+
| 1 | 6 | 1 | 2014-10-15 11:45:50 | 2 |
| 2 | 6 | 2 | 2014-10-15 11:55:52 | 0 |
| 3 | 6 | 3 | 2014-10-15 12:41:52 | 10 |
| 4 | 7 | 2 | 2014-10-15 17:45:22 | 1 |
| 5 | 7 | 3 | 2014-10-16 00:45:55 | 5 |
| 6 | 6 | 5 | 2014-10-16 01:45:11 | 0 |
我也有clk
:
| clkID| submitID | emailID | clkDate | invalidCLK |
+-------+----------+---------+---------------------+------------+
| 1 | 6 | 1 | 2014-10-15 11:45:55 | 1 |
| 2 | 6 | 2 | 2014-10-15 11:55:59 | 0 |
| 3 | 6 | 3 | 2014-10-15 12:42:52 | 5 |
| 4 | 7 | 3 | 2014-10-15 17:46:12 | 0 |
| 5 | 6 | 5 | 2014-10-16 00:46:55 | 0 |
users
表:
| userID | firstName | secondName |
+--------+-----------+------------+
| 1 | john | smith |
| 1 | susan | bella |
submission
表:
| submitID | userID |
+----------+--------+
| 6 | 1 |
| 7 | 2 |
我需要計算opn.submitID來獲取打開次數,並計算clk.submitID來獲取點擊次數以及每個用戶的invalidclk和invalidopn總數。
這是我的預期結果:
| userID | fName | sName | numberOfOpen | SUM(opn.invalidOPN) | numberOfClicks | SUM(clk.invalidCLK) |
+--------+-------+-------+--------------+---------------------+----------------+---------------------+
| 1 | john | smith | 4 | 12 | 4 | 6 |
| 2 | susan | bella | 2 | 6 | 1 | 0 |
我嘗試了這兩個查詢,但未達到所需的結果
SELECT users.userID, users.FirstName, users.SecondName, count(opn.submitID) as "Number of Opens", sum(opn.InvalidOPN) as "Number of invalid Opens"
FROM users
RIGHT JOIN ( submission INNER JOIN opn ON opn.submitID = submission.submitID and OPNDate between "2013-10-01 00:00:00" AND "2014-10-31 23:59:59" ) ON submission.UserID = users.UserID group by users.userID
UNION
SELECT users.userID, users.FirstName, users.SecondName, count(clk.submitID) as "Number of clicks", sum(clk.InvalidCLK) as "Number of invalid clicks"
FROM users
RIGHT JOIN ( submission INNER JOIN clk ON clk.submitID = submission.submitID and CLKDate between "2013-10-01 00:00:00" AND "2014-10-31 23:59:59") ON submission.UserID = users.UserID group by users.userID
SELECT users.userID, users.FirstName, users.SecondName, count(opn.submitID) as "Number of Opens", sum(opn.InvalidOPN) as "Number of invalid Opens", count(clk.submitID) as "Number of clicks", sum(clk.InvalidCLK) as "Number of invalid clicks"
FROM users, submission, clk, opn
where opn.submitID = submission.submitID and clk.submitID = submission.submitID
And CLKDate between "2013-10-01 00:00:00" AND "2014-10-31 23:59:59"
AND submission.UserID = users.UserID group by users.userID
請幫助我,告訴我我需要改變的地方。
這樣做的主要問題是,您要使彼此之間的表相互連接,並獲得opn和clk記錄的每種組合。 在這種情況下,您需要使用COUNT(DISTINCT some_field_name)來計算唯一值:
SELECT users.UserId
COUNT(DISTINCT opn.OPNID),
COUNT(DISTINCT clk.CLKID)
FROM users
LEFT OUTER JOIN submission ON users.UserId = submission.UserId
LEFT OUTER JOIN opn ON submission.SubmitID = opn.SubmitID
LEFT OUTER JOIN clk ON submission.SubmitID = clk.SubmitID
GROUP BY users.UserId
但是,在這種情況下這無濟於事,因為您還需要invalid___字段的總和。
因此,我建議使用幾個子查詢,一個用於clk,一個用於opn。 這些獲取計數和按用戶ID分組的總和。 並將這些子查詢的結果連接到用戶表。
像這樣的東西:
SELECT users.UserId,
users.fName,
users.sName,
numberOfOpen,
COALESCE(invalidopnsum, 0),
numberOfClicks,
COALESCE(invalidclksum, 0)
FROM users
LEFT OUTER JOIN
(
SELECT submission.UserId, COUNT(opn.SubmitID) AS numberOfOpen, SUM(opn.InvalidOPN) AS invalidopnsum
FROM submission
LEFT OUTER JOIN opn ON submission.SubmitID = opn.SubmitID
GROUP BY submission.UserId
) opn1
ON users.UserId = opn1.UserId
LEFT OUTER JOIN
(
SELECT submission.UserId, COUNT(clk.SubmitID) AS numberOfClicks, SUM(clk.InvalidCLK) AS invalidclksum
FROM submission
LEFT OUTER JOIN clk ON submission.SubmitID = clk.SubmitID
GROUP BY submission.UserId
) clk1
ON users.UserId = clk1.UserId
這比您想象的要容易。 您需要做的就是將所有表連接在一起,並使用一些聚合函數。 您可以在userID列上將用戶與提交一起加入,也可以使用SubmitID列將用戶與clk和opn表一起加入。 您可以使用COUNT()獲取打開和單擊的次數,並使用SUM()獲取無效列的總數。 但是,一次完成所有這些計算將不起作用,因為某些事實將重復出現,因此我建議您分別進行每個查詢並將它們合並。
查詢如下所示:
SELECT t.userID, t.firstName, t.secondName, t.numOpen, t.totalInvalidOpen, w.numClick, w.totalInvalidClick
FROM (SELECT u.userID, u.firstName, u.secondName, COUNT(*) AS numOpen, SUM(o.invalidOPN) AS totalInvalidOpen
FROM users u
JOIN submission s ON s.userID = u.userID
JOIN opn o ON o.submitID = s.submitID
GROUP BY u.userID
) t
JOIN (SELECT u.userID, u.firstName, u.secondName, COUNT(*) AS numClick, SUM(c.invalidCLK) AS totalInvalidClick
FROM users u
JOIN submission s ON s.userID = u.userID
JOIN clk c ON c.submitID = s.submitID
GROUP BY u.userID
) w
ON w.userID = t.userID;
而且有效! 這是您的SQL Fiddle 。 注意:您在問題中設置的結果不正確,因為用戶1的無效打開總數僅為12。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.