左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表的条件。 这可以产生非常不同的结果集。 相比之下,如果在ON
或WHERE
子句中提供标准,那么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。