MySQL Left Join, ВЫБЕРИТЕ поле из одного или другого, если ноль - PullRequest
1 голос
/ 08 августа 2011

Я пытаюсь присоединиться к 2 таблицам.который работает хорошо.Но я получаю два набора полей с именем setting_value.Я пытаюсь получить tblSettings. setting_value только если tblAgencySettings. setting_value НЕДЕЙСТВИТЕЛЕН.Как я буду делать это?Я знаю, что могу переименовать поля, тогда в PHP я могу проверить tblAgencySettings. setting_value, а если NULL, то взять tblSettings. setting_value, но я предпочитаю хранить это в MySQL.

SELECT `tblSettings`.`id`, `tblSettings`.`setting_name`,
       `tblSettings`.`setting_value`, `tblAgencySettings`.`setting_value`
FROM `tblSettings` LEFT JOIN `tblAgencySettings` 
ON `tblSettings`.`id` = `tblAgencySettings`.`setting_id`
AND `tblAgencySettings`.`agency_id` = '1'
WHERE `tblSettings`.`changeable` = '1'

небольшая проблема, которую я только что заметил.я не упомянул об этом.если tblAgencySettings.setting_value действительно имеет значение.но changeable это не 1, тогда просто выберите tblSettings.setting_value

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

Измените свой SQL-оператор на следующее:

SELECT `tblSettings`.`id`, `tblSettings`.`setting_name`, 
   CASE WHEN `tblSettings`.`setting_value` IS NULL THEN `tblAgencySettings`.`setting_value` 
    ELSE `tblSettings`.`setting_value` END AS `setting_value` 
    FROM `tblSettings` LEFT JOIN `tblAgencySettings` 
    ON `tblSettings`.`id` = `tblAgencySettings`.`setting_id`
    AND `tblAgencySettings`.`agency_id` = '1'
    WHERE `tblSettings`.`changeable` = '1'

Вот ссылка на MYSQL CASE Statement для вашей справки.

2 голосов
/ 08 августа 2011

Просто добавьте COALESCE :

SELECT `tblSettings`.`id`, `tblSettings`.`setting_name`,
       COALESCE(`tblAgencySettings`.`setting_value`, `tblSettings`.`setting_value`)
FROM `tblSettings` LEFT JOIN `tblAgencySettings` 
ON `tblSettings`.`id` = `tblAgencySettings`.`setting_id`
AND `tblAgencySettings`.`agency_id` = '1'
WHERE `tblSettings`.`changeable` = '1'

Функция COALESCE возвращает первое ненулевое значение, которое вы ей даете, так:

COALESCE(`tblAgencySettings`.`setting_value`, `tblSettings`.`setting_value`)

Будет tblAgencySettings.setting_value, если это не NULL, и tblSettings.setting_value, если tblAgencySettings.setting_value равно NULL.

Если tblAgencySettings.setting_value также может быть нулем, и вы хотите игнорировать это, а также NULL, тогда вы можете использовать это вместо COALESCE выше:

COALESCE(
    IF(`tblAgencySettings`.`setting_value` = 0, NULL, `tblAgencySettings`.`setting_value`),
   `tblSettings`.`setting_value`
)

IF возвращает второй аргумент, если первый является истиной, и третий, если первый аргумент является ложным, поэтому приведенное выше использование преобразует ноль в NULL. Или вы можете пойти до CASE оператора:

case
    when `tblAgencySettings`.`setting_value` = 0     then `tblSettings`.`setting_value`
    when `tblAgencySettings`.`setting_value` IS NULL then `tblSettings`.`setting_value`
    else `tblSettings`.`setting_value`
end    
...