为了账号安全,请及时绑定邮箱和手机立即绑定

左随何处条款

左随何处条款

慕后森 2019-12-12 14:42:08
我需要从设置表中检索所有默认设置,而且还需要获取字符设置(如果存在x字符)。但是此查询仅检索character = 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包含带有字符值的默认值。
查看完整描述

3 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

该where子句过滤掉行left join不成功的行。将其移至联接:


SELECT  `settings`.*, `character_settings`.`value`

FROM    `settings`

LEFT JOIN 

       `character_settings` 

ON     `character_settings`.`setting_id` = `settings`.`id`

        AND `character_settings`.`character_id` = '1'  


查看完整回答
反对 回复 2019-12-12
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

在制作OUTER JOIN(ANSI-89或ANSI-92)时,过滤位置很重要,因为在创建JOIN之前ON应用了子句中指定的条件。进行JOIN后,将应用针对子句中提供的OUTER JOINed表的条件。这会产生非常不同的结果集。相比之下,如果or 子句中提供了条件,则对于INNER JOINs而言无关紧要-结果将是相同的。WHEREONWHERE


  SELECT  s.*, 

          cs.`value`

     FROM SETTINGS s

LEFT JOIN CHARACTER_SETTINGS cs ON cs.setting_id = s.id

                               AND cs.character_id = 1


查看完整回答
反对 回复 2019-12-12
?
哔哔one

TA贡献1854条经验 获得超8个赞

如果我正确理解了您的问题,那么您需要设置数据库中的记录,如果它们没有跨character_settings表的联接,或者该联接记录的character_id = 1。


因此,您应该这样做


SELECT `settings`.*, `character_settings`.`value`

FROM (`settings`)

LEFT OUTER JOIN `character_settings` 

ON `character_settings`.`setting_id` = `settings`.`id`

WHERE `character_settings`.`character_id` = '1' OR

`character_settings`.character_id is NULL


查看完整回答
反对 回复 2019-12-12
  • 3 回答
  • 0 关注
  • 453 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信