如何改进这个嵌套的 MySQL 查询以避免冗余的 WHERE 语句?

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
我尝试了各种嵌套方案,但似乎无法找到正确的方法。我无法更改表结构的任何内容;那是一成不变的。预先感谢您的帮助。

ype*_*eᵀᴹ 5

重新制定您的查询:

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)