我有以下MySQL查詢,產生的結果,我想:店子查詢中多次使用的結果加入
SELECT
`l`.`status`,
`l`.`acquired_by`, `a`.`name` AS 'acquired_by_name',
`l`.`researcher`, `r`.`name` AS 'researcher_name',
`l`.`surveyor`, `s`.`name` AS 'surveyor_name'
FROM `leads` `l`
LEFT JOIN (
SELECT '0' AS 'id', 'Unassigned' AS 'name'
UNION ALL
SELECT `id`, `name`
FROM `web_users`
) `r` ON `r`.`id` = `l`.`researcher`
LEFT JOIN (
SELECT '0' AS 'id', 'Unassigned' AS 'name'
UNION ALL
SELECT `id`, `name`
FROM `web_users`
) `s` ON `s`.`id` = `l`.`surveyor`
LEFT JOIN (
SELECT '0' AS 'id', 'Unassigned' AS 'name'
UNION ALL
SELECT `id`, `name`
FROM `web_users`
) `a` ON `a`.`id` = `l`.`acquired_by`
WHERE `l`.`id` = 566
但正如你所看到的,它具有相同的子查詢在它三次。有沒有辦法執行這個查詢一次並存儲結果,所以我可以使用緩存結果LEFT JOIN
而不是執行相同的查詢三次?
我試圖將它存儲在一個變量:
SET @usercache = (
SELECT '0' AS 'id', 'Unassigned' AS 'name'
UNION ALL
SELECT `id`, `name`
FROM `web_users`
)
...但是這給了我一個錯誤:
1241 - Operand should contain 1 column(s)
...並在此錯誤一些谷歌搜索給我留下了沒有智者。
有誰知道如何讓這個查詢更高效?或者我只是擔心一些無關緊要的事情?
我使用PHP/MySQLi,如果它有任何區別。
當然,這是一個更好的方法來做到這一點。只是測試...... ;-)其實我以前從未有過使用'COALESCE()'的理由,而我完全忘記了它的存在。 – DaveRandom 2012-03-06 13:23:05