将两个相似的查询组合在一起

时间:2014-09-02 15:11:14

标签: mysql

我有MySQL查询,这两个查询都能很好地独立工作,我想将它们组合在一起,所以我得到了三个值。

查询1检查已删除的帐户数:

SELECT
    COUNT(1) AS deleted_count,
    SUBDATE(e.timestamp, INTERVAL WEEKDAY(e.timestamp) DAY) AS display_date
FROM 
    exit_reasons e
WHERE 
    e.timestamp>='$sixmonths'
GROUP BY 
    WEEKOFYEAR(e.timestamp)
ORDER BY
    display_date ASC
LIMIT 26

这将返回日期和在该周删除的号码

查询2检查其中有多少人随后再次注册:

SELECT
    COUNT(1) AS date_count,
    SUBDATE(e.timestamp, INTERVAL WEEKDAY(e.timestamp) DAY) AS display_date
FROM 
    exit_reasons e
LEFT JOIN
    companies c on e.email=c.email
WHERE
    e.timestamp>='$sixmonths' AND c.email IS NOT NULL
GROUP BY
    WEEKOFYEAR(e.timestamp)
ORDER BY 
    display_date ASC
LIMIT 26

这将返回一个日期和已删除的人数,这些人现在拥有一个新帐户

我希望它返回一个日期然后删除号码并在一个查询中重新加入号码,所以我尝试了:

SELECT
    COUNT(1) AS date_count,
    SUBDATE(e.timestamp, INTERVAL WEEKDAY(e.timestamp) DAY) AS display_date,
    date_count as rejoined_count from
        (SELECT
            COUNT(1) AS date_count,
            SUBDATE(e.timestamp, INTERVAL WEEKDAY(e.timestamp) DAY) AS display_date
        FROM 
            exit_reasons e2
        LEFT JOIN 
            companies c on e.email=c.email
        LEFT JOIN
            companies_users cu on e.email=cu.email
        WHERE 
            e2.timestamp>='$sixmonths' AND c.email IS NOT NULL
        GROUP BY 
            WEEKOFYEAR(e.timestamp)
        ORDER BY
            display_date ASC
        LIMIT 26)
FROM 
    exit_reasons e
WHERE 
    e.timestamp>='$sixmonths'
GROUP BY 
    WEEKOFYEAR(e.timestamp)
ORDER BY
    display_date ASC
LIMIT 26

但是我收到了语法错误 - 如何将这些查询组合成一个查询?

2 个答案:

答案 0 :(得分:1)

您应该能够通过使用聚合函数以及一些条件逻辑(如CASE表达式)将两个查询合并为一个查询:

SELECT
   COUNT(1) AS deleted_count,
   SUM(CASE WHEN c.email IS NOT NULL THEN 1 ELSE 0 END) as date_count,
   SUBDATE(e.timestamp, INTERVAL WEEKDAY(e.timestamp) DAY) AS display_date
FROM exit_reasons e
LEFT JOIN companies c 
    on e.email=c.email
WHERE e.timestamp>='$sixmonths'
GROUP BY WEEKOFYEAR(e.timestamp)
ORDER BY display_date ASC
LIMIT 26;

See Demo。如果c.email IS NOT NULL被移动到SUM(CASE..,那么您可以检查第二个查询,这允许您获得非空行的总数。

答案 1 :(得分:0)

我认为以下内容可以满足您的需求:

SELECT COUNT(*) AS deleted_count,
       COUNT(c.email) as date_count,
       SUBDATE(e.timestamp, INTERVAL WEEKDAY(e.timestamp) DAY) AS display_date
FROM exit_reasons e LEFT JOIN
     companies c
     on e.email = c.email
WHERE e.timestamp >= '$sixmonths'
GROUP BY  WEEKOFYEAR(e.timestamp)
ORDER BY display_date ASC
LIMIT 26;

如果有人可以使用同一封电子邮件多次注册,您应该将count()更改为使用distinct

COUNT(DISTINCT e.email) as deleted_count,
COUNT(DISTINCT c.email) as date_count