MYSQL Left Join Or Получить значение из подзапроса, если значение существует - PullRequest
1 голос
/ 17 октября 2011

У меня есть запрос ниже, и он отлично работает, никаких проблем

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 (другие значения могут быть NULL) .

Для этого я попытался добавить подзапрос в качестве таблицы псевдонимов и оставил соединение с этой таблицей псевдонимов, Но так как у меня есть другие условия, я все еще не получаю код автомобиля. Также попытался выполнить соединение с тремя другими таблицами и в результате выполнить левое соединение с таблицей my_car. Но это занимает время, так как я не проверяю код автомобиля в запросе первого уровня

Любой способ присоединиться и получить код машины из таблицы my_cars, даже если в других моих таблицах ничего не найдено ...?

1 Ответ

3 голосов
/ 17 октября 2011

Вы можете присоединиться к остальным таблицам снова car_code, что делает car_code ведущим запросом.Или правое присоединение car_code к вашему текущему запросу, что по сути имеет тот же эффект, но я бы порекомендовал не смешивать левое соединение и правое соединение.

Проблема в том, что вам всегда будет нужен код автомобиля, иначе вы не получите другие данные (та же проблема, что и сейчас, но наоборот), но, как я читаю ваши требования, это не должнобыть проблемой:

Я настоятельно советую вам использовать более согласованные имена полей в таблицах, а также использовать соединения INNER и LEFT и псевдонимы таблиц для удобства чтения.Ваш запрос может выглядеть следующим образом, хотя он и не завершен, поскольку я не знаю точных отношений между вашими таблицами.

   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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...