Как можно оптимизировать SQL запрос?

Существует запрос к таблице bonuses, в котором исходя из содержимого полей referrer_id_vk и promo_code_id (одно из них равно NULL) делаются подзапросы в таблицы referrers (referral_settings) либо promo_codes

SELECT *,
            IF
            (
                referrer_id_vk, 
                IF
                (
                    (SELECT referral_first_deposit_bonus FROM `referrers` WHERE id_vk = '$id_vk'),
                    (SELECT referral_first_deposit_bonus FROM `referrers` WHERE id_vk = '$id_vk'),
                    (SELECT referral_first_deposit_bonus FROM `referral_settings` WHERE id = 1)
                ),
                (SELECT value FROM `promo_codes` WHERE id = promo_code_id)
            ) AS value 
FROM `bonuses` WHERE id_vk = '$id_vk" 

Как видите, в коде дублируется этот подзапрос

SELECT referral_first_deposit_bonus FROM referrers WHERE id_vk = '$id_vk'

сначала он производится чтобы проверить есть ли значение в таблице referrers , если есть, то снова делает этот же запрос, чтобы уже вернуть результат, иначе делает запрос в таблицу referral_settings . Можно ли избежать дублирование подзапроса в этом моменте?


Ответы (1 шт):

Автор решения: mustaccio

Я бы использовал соединение таблиц, что-то вроде этого:

SELECT b.*,
       IF
       (
           referrer_id_vk, 
           COALESCE(r.referral_first_deposit_bonus, rs.referral_first_deposit_bonus),
           pc.value
        ) AS value 
FROM `bonuses` b
LEFT JOIN `referrers` r on b.id_vk = r.id_vk
INNER JOIN `referral_settings` rs ON rs.id = 1
LEFT JOIN `promo_codes` pc ON pc.id = b.promo_code_id
WHERE b.id_vk = '$id_vk" 
→ Ссылка