Объединение нескольких таблиц, даже если значение столбца равно нулю

#mysql #laravel

#mysql #laravel

Вопрос:

У меня есть таблица Users , в которой есть внешние ключи для 3 других таблиц (в таблице есть 10 других столбцов, но они не имеют значения)

 ID    CityId    CountryID    StateId
1     1         2            null
2     4         2            null
3     54        3            1
  

Теперь мне нужно объединить таблицы городов, стран и штатов по их уважаемым ids . Все 3 таблицы следуют приведенному ниже шаблону [ID/Name/Language/ColumnNameID]

Таблица городов:

 ID   Name       CityId  Language
1    Budapest   1       En
2    Paris      15      En
3    Berlin     54      En
4    Szeged     4       En
  

Таблица стран:

 ID   Name      CountryId  Language
1    Hungary   2          En
2    Germany   3          En
  

Таблица состояний:

 ID   Name      StateId    Language
1    Berlin    1          En
  

И вот запрос для leftJoin всех трех таблиц в таблицу Users:

 $results = DB::table('users')
    ->leftJoin('city', 'users.city_id', '=', 'city.city_id')
    ->where('city.language', '=', 'en')
    ->leftJoin('country', 'users.country_id', '=', 'country.country_id')
    ->where('country.language', '=', 'en')
    ->leftJoin('state', 'users.state_id', '=', 'state.state_id')
    ->where('state.language', '=', 'en')
    ->select('country.id', 'users.first_name', 'users.last_name', 'country.name as country_name', 'city.name as city_name', 'state.name as state_name')
    ->get();
  

Работает, но я не получаю результатов, где в users таблице под state id столбцом указаны значения null . Вот как это выглядит:

 Id  First_Name    Last_Name  City_Name   Country_Name  State_Name
2   XXX           XXX        Berlin      Germany       Berlin
  

Две записи, которые имеют StateID = null, отсутствуют. Что я могу с этим поделать?

Комментарии:

1. Переместите условие из WHERE в ON (в условие для LEFT JOIN). В SQL это выглядит так FROM users LEFT JOIN city ON (users.city_id = city.city_id AND city.language = 'en') LEFT JOIN country ... .

Ответ №1:

Отбрасываются строки, в которых идентификатор состояния равен нулю. where('state.language', '=', 'en') Вы должны добавить условие, что язык может быть нулевым, если вы хотите сохранить эти строки. Я не уверен, как вы могли бы реализовать это в Laravel, но SQL будет выглядеть так:

 where (state.language is null or state.language = 'EN')