左随何处条款

我需要从设置表中检索所有默认设置,而且还需要获取字符设置(如果存在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包含带有字符值的默认值。


慕后森
浏览 456回答 3
3回答

紫衣仙女

该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'  

慕盖茨4494581

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

哔哔one

如果我正确理解了您的问题,那么您需要设置数据库中的记录,如果它们没有跨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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server