Store subquery results for use across multiple joins

I have the following MySQL query that gives the result I want:

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

      

But as you can see it has the same subquery in it three times. Is there a way to run this query once and store the result, so I can LEFT JOIN

with cached results instead of running the same query three times?

I tried to store it in a variable:

SET @usercache = (
  SELECT '0' AS 'id', 'Unassigned' AS 'name'
  UNION ALL
  SELECT `id`, `name`
  FROM `web_users`
)

      

... but this gives me an error:

1241 - The operand must contain 1 column

... and some Googling on this mistake didn't leave me at all.

Does anyone know how I can make this query more efficient? Or am I just worried about something that doesn't matter?

I am using PHP / MySQLi if that matters.

+3


source to share


2 answers


Do you really need subqueries? How about this:



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

      

+2


source


you can't run it once - you actually use it three times to get three different results ...



0


source







All Articles