2014-03-04 35 views
1

我目前有:加快MySQL的內部查詢

SELECT ads, id as mid, (SELECT IFNULL(SUM(amount),0) FROM trans WHERE paidout=0 AND user_id=mid) as amount FROM accounts

我怎麼能執行內部和查詢,然後再通過它放在一起以同樣的方式結餘?

+0

使用連接,並在GROUP BY – AgRizzo

回答

0

子查詢將針對返回的每一行執行。如果您將其轉換爲LEFT JOIN,它將被執行一次,並且應該快得多。

SELECT 
    ads, 
    id AS mid, 
    COALESCE(amount, 0) AS amount 
FROM 
    accounts 
    LEFT JOIN (
    /* Subquery returns SUM(amount) per user_id */ 
    /* LEFT JOIN in case there are no matching records */ 
    SELECT user_id, SUM(amount) AS amount 
    FROM trans 
    WHERE paidout = 0 
    GROUP BY user_id 
) amt ON accounts.id = amt.user_id 

SUM()可以在你的情況下,外部查詢進行爲好,應用GROUP BY超過所有其他列。

SELECT 
    accounts.ads, 
    accounts.id AS mid 
    COALESCE(SUM(amount), 0) AS amount 
FROM 
    accounts 
    LEFT JOIN trans ON accounts.id = trans.user_id 
WHERE trans.paidout = 0 
GROUP BY 
    accounts.ads, 
    mid 
+0

未知列 '中' '的條款' – user3287662

+0

@ user3287662使用'accounts.id = amt.user_id' –

+0

哇,多複雜,非常感激,所以速度 – user3287662

0

像這樣的東西應該工作:

SELECT ads, accounts.id as mid, ifnull(sum(amount),0) as amount 
FROM accounts 
LEFT JOIN trans ON paidout=0 AND user_id=accounts.id 
GROUP BY accounts.id 
0

這將只有兩個選擇VS(1+(以量行NUM))選擇,因爲你今天有它。

select ads, mid, IFNULL(SUM(amount),0) as total 
from (
    SELECT a.ads, a.id as mid, amount 
    from accounts a 
    join trans t on t.user_id = a.id and t.paidout = 0 
) 
group by ads, mid