左join在哪里条款

我需要从设置表中检索所有的默认设置,但如果存在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') ) 

当键0包含字符值的默认值时,键1和2是默认值。

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' 

在进行OUTER JOIN(ANSI-89或ANSI-92)时,过滤位置很重要,因为ON子句中指定的条件在JOIN生效之前已应用。 joinJOIN后,应用WHERE子句中提供的针对OUTER JOINed表的条件。 这可以产生非常不同的结果集。 相比之下,如果在ONWHERE子句中提供标准,那么INNER JOINs就没有关系 – 结果将是相同的。

  SELECT s.*, cs.`value` FROM SETTINGS s LEFT JOIN CHARACTER_SETTINGS cs ON cs.setting_id = s.id AND cs.character_id = 1 

如果我正确理解您的问题,您需要设置数据库中的logging,如果它们没有与character_settings表的连接,或者连接logging的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 

您可能会发现使用简单的子查询更容易理解

 SELECT `settings`.*, ( SELECT `value` FROM `character_settings` WHERE `character_settings`.`setting_id` = `settings`.`id` AND `character_settings`.`character_id` = '1') AS cv_value FROM `settings` 

允许子查询返回null,因此您不必担心主查询中的JOIN / WHERE。

有时候,这在MySQL中运行得更快 ,但是将其与LEFT JOIN表单进行比较,看看哪种方法最适合您。

 SELECT s.*, c.value FROM settings s LEFT JOIN character_settings c ON c.setting_id = s.id AND c.character_id = '1' 

基于SQL语句的结果是正确的。 左连接返回右表中的所有值,并且只匹配左表中的值。

ID和NAME列来自右侧表,因此被返回。

得分来自左表,并且返回30,因为该值涉及名称“stream量”。 其他名称为NULL,因为它们与名称“Flow”无关。

以下将返回您所期望的结果:

  SELECT a.*, b.Score FROM @Table1 a LEFT JOIN @Table2 b ON a.ID = b.T1_ID WHERE 1=1 AND a.Name = 'Flow' 

SQL在右手表上应用一个filter。