[英]MySQL Left Join, SELECT a field either from one or the other if null
I am trying to LEFT JOIN 2 tables. 我试图LEFT JOIN 2表。 which is working out fine. 这很好。 But i am getting back two sets of fields named setting_value
. 但我回来了两组名为setting_value
的字段。 iam trying to get tblSettings
. 我试图获得tblSettings
。 setting_value
only if tblAgencySettings
. 仅在tblAgencySettings
setting_value
。 setting_value
is NULL. setting_value
为NULL。 How would i go about doing this? 我该怎么做呢? I know i can rename the fields, then in PHP i can check the tblAgencySettings
. 我知道我可以重命名字段,然后在PHP中我可以检查tblAgencySettings
。 setting_value
and if NULL then grab the tblSettings
. setting_value
如果为NULL则抓住tblSettings
。 setting_value
but i prefer to keep this at MySQL. 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'
slight issue i just noticed. 我刚注意到的一个小问题。 i failed to mention this. 我没提到这个。 if tblAgencySettings.setting_value does have a value. 如果tblAgencySettings.setting_value确实有值。 but changeable is not 1 then just select tblSettings.setting_value 但是更改不是1然后只需选择tblSettings.setting_value
Just add a COALESCE : 只需添加一个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'
The COALESCE function returns the first non-NULL value you give it so this: COALESCE函数返回您给出的第一个非NULL值,所以:
COALESCE(`tblAgencySettings`.`setting_value`, `tblSettings`.`setting_value`)
Will be tblAgencySettings.setting_value
if that's not NULL and tblSettings.setting_value
if tblAgencySettings.setting_value
is NULL. 将tblAgencySettings.setting_value
如果这不是NULL和tblSettings.setting_value
如果tblAgencySettings.setting_value
为NULL。
If tblAgencySettings.setting_value
can also be zero and you want to ignore that as well as NULL, then you could use this instead of the COALESCE above: 如果tblAgencySettings.setting_value
也可以为零,并且您想要忽略它以及NULL,那么您可以使用它而不是上面的COALESCE:
COALESCE(
IF(`tblAgencySettings`.`setting_value` = 0, NULL, `tblAgencySettings`.`setting_value`),
`tblSettings`.`setting_value`
)
The IF
returns the second argument if the first is true and the third if the first argument is false so the above use converts zero to NULL. 如果第一个参数为真,则IF
返回第二个参数,如果第一个参数为假,则返回第三个参数,因此上述使用将零转换为NULL。 Or, you could go all the way to a CASE statement: 或者,您可以一直到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
Change your SQL Statement to this: 将您的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'
Here's a link to MYSQL CASE Statement for your reference. 这是MYSQL CASE Statement的链接供您参考。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.