Проблема с вашим запросом не LEFT JOIN
. Это сравнение WHERE
. Есть две проблемы:
-
OR
. - Идентификаторы, предположительно, числа, а не строки. Не смешивайте типы.
Начните с этого "половинного" запроса:
SELECT dis.*, d.deal_id,
CONCAT(ub.first_name, ' ', ub.last_name) AS buyer_name,
CONCAT(us.first_name, ' ', us.last_name) AS seller_name,
d.payment_method, d.added_delivery, d.item_to_buy_type,
d.item_to_buy_description
FROM prepay_main_staging.pp_dispute dis JOIN
pp_deal d
ON d.id = dis.id_deal JOIN
pp_user ub
ON ub.id = dis.id_buyer JOIN
pp_user us
ON us.id = dis.id_seller
WHERE dis.id_seller = 9;
Сначала обратите внимание, что я изменил псевдонимы таблиц на что-то осмысленное - сокращения таблиц. Теперь выполнить запрос намного проще.
Я также изменил JOIN
s на внутренние соединения и исправил сравнение.
Для этого запроса вы хотите индексировать один:
pp_dispute(id_seller, id_deal, id_buyer)
Я предполагаю, что id
в другой таблице уже объявлены как первичные ключи.
Посмотрите, как быстро это работает. Если он работает быстро, напишите тот же запрос для id_buyer
и используйте UNION ALL
для их объединения. MySQL в частности - и базы данных в целом - плохо справляются с оптимизацией OR
условий.
Следует отметить, что вы можете заменить JOIN
s на LEFT JOIN
s и вы ' Посмотрим, что не изменит производительность в этой версии. Однако, LEFT JOIN
, вероятно, не является логически правильным.