mysql查询在哪里我得到的行数值等于一行相同的表

时间:2017-10-16 12:58:19

标签: mysql

我可以使用mysql查询获取行数,值等于同一行的行。

请检查我的以下查询,我可以优化它。它需要很长时间才能加载

SELECT CASE
    WHEN 
        table1.issue_type = 'email' 
    THEN 
        (SELECT Count(tabl1a.id) FROM table1 AS table1a WHERE table1a.email = table1.email)
    ELSE 
        (SELECT Count(table1a.id) FROM table1 AS table1a WHERE table1a.phone_day = table1.phone_day) 
    END 
    AS emails
    FROM table1

请告诉我

1 个答案:

答案 0 :(得分:3)

select子句中此类相关子查询的常用补救方法是重构,而不是连接到执行聚合的子查询。在这种情况下,您实际上有两种不同的聚合,因此我们可以将连接保留为两个子查询来执行聚合。

SELECT
    t1.issue_type,
    COALESCE(t2.email_cnt, t3.phone_cnt) AS emails
FROM table1 t1
LEFT JOIN
(
    SELECT email, COUNT(*) AS email_cnt
    FROM table1
    GROUP BY email
) t2
    ON t1.email = t2.email AND
       t1.issue_type = 'email'
LEFT JOIN
(
    SELECT phone_day, COUNT(*) AS phone_cnt
    FROM table1
    GROUP BY phone_day
) t3
    ON t1.phone_day = t3.phone_day AND
       t1.issue_type <> 'email'

这里的技巧是为连接标准添加条件,检查问题类型是否为电子邮件。这可以保证表中的每条记录都将连接到一个且只有一个子查询。我们使用COALESCE来选择非NULL计数,来自电子邮件或电话日聚合。