MYSQL левое соединение или получение значения из подзапроса, если значение существует

#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. Спасибо за это решение и предложения. Просто изменил запрос, чтобы удалить комментарий, который вы дали. Это было замечательное решение. Еще раз спасибо