我可以使用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
请告诉我
答案 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计数,来自电子邮件或电话日聚合。