簡體   English   中英

從四個具有count和sum列以及where子句的mysql表中選擇

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM