3 mysql
我正在尝试使用以下表结构改进嵌套的 MySQL 查询(省略了与我的问题无关的几十个):
tbl_users :(
ID | email
我们电子邮件列表的所有订阅者)
tbl_mailings :(
ID | mail_title
每封营销邮件)
tbl_sends :(
ID | user_id | mailing_id
每个用户发送的每个邮件)
tbl_opens :(
ID | user_id | mailing_id
打开每个邮件的每个用户)
tbl_actions :(
ID | user_id | mailing_id
对每个邮件采取目标操作的每个用户)
我继承了这个查询,我一直在使用它来获取每个邮件的打开率和操作率:
SELECT subq_opens.numopens/subq_sends.numsends as Open_Rate,
subq_actions.numactions/subq_sends.numsends as Action_Rate,
FROM
(SELECT COUNT(DISTINCT sends.userID) AS numsends
FROM tbl_sends WHERE mailing_id = 5694) AS subq_sends,
(SELECT COUNT(DISTINCT opens.userID) AS numopens
FROM tbl_opens WHERE mailing_id = 5694) AS subq_opens,
(SELECT COUNT(DISTINCT actions.userID) AS numactions
FROM tbl_actions WHERE mailing_id = 5694) AS subq_actions
Run Code Online (Sandbox Code Playgroud)
不太优雅,但功能强大,即使我每次都必须在多个地方更改邮件 ID。
但是,现在我需要将 WHERE 语句更改为更复杂的内容,而且我不想重复 WHERE 语句这么多次。
有没有办法可以在没有多余的情况下重新表述这个WHERE
?
我尝试了各种嵌套方案,但似乎无法找到正确的方法。我无法更改表结构的任何内容;那是一成不变的。预先感谢您的帮助。
重新制定您的查询:
SELECT
numopens / numsends AS Open_Rate,
numactions / numsends AS Action_Rate
FROM
( SELECT
( SELECT COUNT(DISTINCT s.userID)
FROM tbl_sends AS s
WHERE s.mailing_id = param.mailing_id
)
AS numsends,
( SELECT COUNT(DISTINCT o.userID)
FROM tbl_opens AS o
WHERE o.mailing_id = param.mailing_id
)
AS numopens
( SELECT COUNT(DISTINCT a.userID)
FROM tbl_actions AS a
WHERE a.mailing_id = param.mailing_id
)
AS numactions
FROM
( SELECT
5694 AS mailing_id,
417 AS another_parameter,
'funny' AS one_more_parameter
) AS param
) AS cte ;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8088 次 |
最近记录: |