복붙노트

[SQL] 왼쪽 Where 절과 함께 가입

SQL

왼쪽 Where 절과 함께 가입

내가 설정 테이블의 모든 기본 설정을 검색하지만 X 문자가있는 경우, 또한 문자 설정을 잡아해야합니다.

그러나이 쿼리는 문자 = 1 이러한 설정이 아닌 사용자 havent 한 사람을 잘 살고 경우 기본 설정을 검색하는 중입니다.

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은 문자 값과 기본값이 포함 된 경우.

해결법

  1. ==============================

    1.WHERE 절은 왼쪽 성공하지 못한 조인 행을 멀리 필터링됩니다. 조인으로 이동 :

    WHERE 절은 왼쪽 성공하지 못한 조인 행을 멀리 필터링됩니다. 조인으로 이동 :

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

    2.만드는 외부 (ANSI-89 또는 ANSI-92)을 조인 할 때 조인하기 전에 ON 절에 지정된 기준이 적용되기 때문에 여과 위치 문제가된다. (가) 제조 조인 후 OUTER 대해 기준이인가된다 WHERE 절에 제공된 테이블 합류. 이것은 매우 다른 결과 세트를 생성 할 수 있습니다. 결과는 동일합니다 - 비교,이 기준이 ON 또는 WHERE 절에 제공되는 경우 내부 조인에 대한 문제가되지 않습니다.

    만드는 외부 (ANSI-89 또는 ANSI-92)을 조인 할 때 조인하기 전에 ON 절에 지정된 기준이 적용되기 때문에 여과 위치 문제가된다. (가) 제조 조인 후 OUTER 대해 기준이인가된다 WHERE 절에 제공된 테이블 합류. 이것은 매우 다른 결과 세트를 생성 할 수 있습니다. 결과는 동일합니다 - 비교,이 기준이 ON 또는 WHERE 절에 제공되는 경우 내부 조인에 대한 문제가되지 않습니다.

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

    3.나는 당신의 질문을 이해한다면 그들이이 character_settings 테이블 건너에 가입하거나이없는 경우 올바르게 설정 데이터베이스에서 레코드를 원하는 합류 기록은 character_id = 1이있는 경우.

    나는 당신의 질문을 이해한다면 그들이이 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
    
  4. ==============================

    4.당신은 간단한 하위 쿼리를 사용하여 이해하기 쉽게 찾을 수 있습니다

    당신은 간단한 하위 쿼리를 사용하여 이해하기 쉽게 찾을 수 있습니다

    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`
    

    당신이 WHERE 주 쿼리에 대한 / 가입 걱정할 필요가 없습니다 있도록 하위 쿼리가 반환 null로 허용됩니다.

    때때로이 빠른 MySQL의에서 작동하지만, 좌 비교할 당신을 위해 가장 적합한보고 양식을 가입하세요.

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

    5.결과는 SQL 문을 기반으로 올바른 것입니다. 왼쪽은 왼쪽 테이블에서 오른쪽 테이블에서 반환 모든 값을, 만 일치하는 값에 가입하세요.

    결과는 SQL 문을 기반으로 올바른 것입니다. 왼쪽은 왼쪽 테이블에서 오른쪽 테이블에서 반환 모든 값을, 만 일치하는 값에 가입하세요.

    ID와 NAME 열, 오른쪽 테이블에서 너무 반환합니다.

    점수는 왼쪽 테이블에서이며,이 값이 이름 "흐름"에 관련된 30, 반환됩니다. 그들은 이름 "흐름"에 관련되지 않는 다른 이름은 NULL입니다.

    아래 당신이 기대했던 결과를 반환합니다 :

        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은 오른쪽 테이블에 필터를 적용합니다.

  6. ==============================

    6.이 문제에 대한 비 사소한 왼쪽 조인을 포함하는 많은 다른 사람과 같은 왼쪽에 합류 내부에 가입 한 테이블에, 나는 그것이 편리하고 좀 더 읽을 절와 함께 쿼리를 분할 찾을 수 등. 당신의 예에서,

    이 문제에 대한 비 사소한 왼쪽 조인을 포함하는 많은 다른 사람과 같은 왼쪽에 합류 내부에 가입 한 테이블에, 나는 그것이 편리하고 좀 더 읽을 절와 함께 쿼리를 분할 찾을 수 등. 당신의 예에서,

    with settings_for_char as (
      select setting_id, value from character_settings where character_id = 1
    )
    select
      settings.*,
      settings_for_char.value
    from
      settings
      left join settings_for_char on settings_for_char.setting_id = settings.id;
    
  7. from https://stackoverflow.com/questions/4752455/left-join-with-where-clause by cc-by-sa and MIT license