我目前有:加快MySQL的內部查詢
SELECT ads, id as mid, (SELECT IFNULL(SUM(amount),0) FROM trans WHERE paidout=0 AND user_id=mid) as amount FROM accounts
我怎麼能執行內部和查詢,然後再通過它放在一起以同樣的方式結餘?
我目前有:加快MySQL的內部查詢
SELECT ads, id as mid, (SELECT IFNULL(SUM(amount),0) FROM trans WHERE paidout=0 AND user_id=mid) as amount FROM accounts
我怎麼能執行內部和查詢,然後再通過它放在一起以同樣的方式結餘?
子查詢將針對返回的每一行執行。如果您將其轉換爲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
未知列 '中' '的條款' – user3287662
@ user3287662使用'accounts.id = amt.user_id' –
哇,多複雜,非常感激,所以速度 – user3287662
像這樣的東西應該工作:
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
這將只有兩個選擇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
使用連接,並在GROUP BY – AgRizzo