Как можно оптимизировать 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"