2012-03-06 74 views
3

我有以下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,如果它有任何區別。

回答

2

你真的需要的子查詢?這個怎麼樣:

SELECT 
    `l`.`status`, 
    `l`.`acquired_by`, COALESCE(`a`.`name`, 'Unassigned') AS 'acquired_by_name', 
    `l`.`researcher`, COALESCE(`r`.`name`, 'Unassigned') AS 'researcher_name', 
    `l`.`surveyor`, COALESCE(`s`.`name`, 'Unassigned') AS 'surveyor_name' 
FROM `leads` `l` 
LEFT JOIN `web_users` `r` ON `r`.`id` = `l`.`researcher` 
LEFT JOIN `web_users` `s` ON `s`.`id` = `l`.`surveyor` 
LEFT JOIN `web_users` `a` ON `a`.`id` = `l`.`acquired_by` 
WHERE `l`.`id` = 566 
+0

當然,這是一個更好的方法來做到這一點。只是測試...... ;-)其實我以前從未有過使用'COALESCE()'的理由,而我完全忘記了它的存在。 – DaveRandom 2012-03-06 13:23:05

0

你不能運行一次 - 你實際使用的是三次獲得三種不同的結果...

+0

它總是會返回相同的結果集,除非同時查詢被執行'web_users'表進行了修改,雖然這是極不可能的。子查詢存在的唯一原因是爲未分配的項目添加一個'id'爲'0'的行。 – DaveRandom 2012-03-06 13:29:53