2017-10-16 30 views
0

我可以有一個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 

建議我請

+0

這是你的整個查詢?你不選擇任何其他列?這個查詢只會給你很多數字,其中很多都是重複的。 (例如,在phone_day 100上有兩封電子郵件='john',兩封電子郵件='jane'和三封非電子郵件,你會得到類似2,3,3,2,3,2,2的東西。) –

回答

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來選擇來自電子郵件或電話日彙總的非空計數。

+0

您是否認爲OP理解你寫的一個單詞,或者他(她)只是想讓某人爲他們工作? – Mjh

+0

@Mjh對於這個複雜的疑問,我懷疑是否有人跟着我說的一個字。那麼,也許戈登·林諾,如果他關心閱讀:-( –

+0

所以你不介意做更多免費的工作,看看我們是如何開始的東西?:) – Mjh