#mysql #sql #join
#mysql #sql #Присоединиться
Вопрос:
У меня есть приведенный ниже запрос, и он работает идеально, никаких проблем
SELECT description category,
details,
created_by,
CONCAT(name,' ',surname) name,
FROM_UNIXTIME(createdon) created_date,
FROM_UNIXTIME(updatedon) updated_date,
comments_count,
entry_id,
code car_code
FROM my_area_details,my_user,my_master_area_categories
WHERE type=4
AND code IN ( SELECT car_code
FROM my_cars
WHERE car_company='GM'
AND car_model='Chevy')
AND my_area_details.created_by=my_user.user_id
AND my_area_details.category=my_master_area_categories.type_id
ORDER BY category
В приведенном выше запросе приведенный ниже подзапрос возвращает только одно значение или ничего
SELECT car_code
FROM my_cars
WHERE car_company='GM'
AND car_model='Chevy'
В первом запросе, если в других моих таблицах нет совпадающих записей, я получаю нулевые записи.
Мое требование заключается в том, что если подзапрос имеет значение, а основной запрос не возвращает никаких записей (из-за того, что записи не найдены в других таблицах), я должен по крайней мере получить значение car_code из my_cars (другие значения могут быть нулевыми).).
Для этого я попытался добавить подзапрос в качестве таблицы псевдонимов и выполнил левое соединение с этой таблицей псевдонимов, но поскольку у меня есть другие условия, я все еще не получаю код car .Также пытался выполнить объединение в трех других таблицах и в результате выполнить левое соединение с таблицей my_car. Но это требует времени, поскольку я не проверяю код car в запросе первого уровня
Любой способ присоединиться и получить car_code из таблицы my_cars, даже если в других моих таблицах нет ничего подходящего …?
Ответ №1:
Вы можете снова объединить остальные таблицы по левой стороне car_code
, таким образом, сделав car_code ведущим запросом. Или правое соединение car_code
с вашим текущим запросом, что, по сути, имеет тот же эффект, но я бы рекомендовал не смешивать левое соединение и правое соединение.
Проблема в том, что вам всегда будет нужен car_code, иначе вы не получите другие данные обратно (та же проблема, что и сейчас, но наоборот), но, поскольку я прочитал ваши требования, это не должно быть проблемой:
Я настоятельно рекомендую вам использовать более согласованные имена полей в таблицах, а также использовать ВНУТРЕННИЕ и ЛЕВЫЕ соединения и псевдоним таблицы для удобства чтения. Ваш запрос может выглядеть следующим образом, хотя он не завершен, поскольку я не знаю точных отношений между вашими таблицами.
SELECT description category,
details,
created_by,
CONCAT(name,' ',surname) name,
FROM_UNIXTIME(createdon) created_date,
FROM_UNIXTIME(updatedon) updated_date,
comments_count,
entry_id,
code car_code
FROM car_code cc
LEFT JOIN my_area_details ad ON ad.code = cc.car_code
AND ad.type = 4
LEFT JOIN my_user u ON u.user_id = ad.created_by
LEFT JOIN my_master_area_categories mac ON mac.type_id = ad.category
WHERE car_code.car_company = 'GM'
AND car_code.car_model = 'Chevy'
ORDER BY category
Комментарии:
1. Спасибо за это решение и предложения. Просто изменил запрос, чтобы удалить комментарий, который вы дали. Это было замечательное решение. Еще раз спасибо