Мне нужно получить все настройки по умолчанию из таблицы настроек, но также получить настройки символов, если они существуют для символа x.
Но этот запрос извлекает только те настройки, где символ = 1, а не настройки по умолчанию, если пользователь никого не установил.
SELECT `settings`.*, `character_settings`.`value`
FROM (`settings`)
LEFT JOIN `character_settings`
ON `character_settings`.`setting_id` = `settings`.`id`
WHERE `character_settings`.`character_id` = '1'
Поэтому мне нужно что-то вроде этого:
array(
'0' => array('somekey' => 'keyname', 'value' => 'thevalue'),
'1' => array('somekey2' => 'keyname2'),
'2' => array('somekey3' => 'keyname3')
)
Где ключи 1 и 2 являются значениями по умолчанию, когда ключ 0 содержит значение по умолчанию со значением символа.
источник
Возможно, вам будет легче понять, используя простой подзапрос
Подзапросу разрешено возвращать ноль, поэтому вам не нужно беспокоиться о JOIN / WHERE в основном запросе.
Иногда это работает быстрее в MySQL, но сравните его с формой LEFT JOIN, чтобы увидеть, что работает лучше для вас.
источник
Результат правильный на основании оператора SQL. Левое соединение возвращает все значения из правой таблицы и только совпадающие значения из левой таблицы.
Столбцы ID и NAME находятся в правой части таблицы, поэтому возвращаются.
Оценка берется из левой таблицы, и возвращается 30, так как это значение относится к имени «Поток». Другие имена имеют значение NULL, поскольку они не относятся к имени «Поток».
Ниже приведен результат, который вы ожидали:
SQL применяет фильтр к правой таблице.
источник
Для этой проблемы, как и для многих других, связанных с нетривиальными левыми объединениями, такими как левое соединение во внутренних объединенных таблицах, я считаю удобным и несколько более удобочитаемым разделение запроса с помощью
with
предложения. В вашем примереисточник