2011-03-02 3 views
0

2 테이블MySQL LEFT JOIN 문제

countries: 
id, name 

results: 
id, stat, type, country, value, date 

stat은 10 개의 값과 type 중 하나 일 수 있습니다. 2. Countrycountries 테이블에있는 국가의 ID입니다.

특정 날짜의 결과가 일부 국가에만있는 것은 아닙니다.

LEFT JOIN를 만들려면 어떻게해야합니까? 모든 국가가 모든 stat - type 조합으로 나열되므로 국가에 결과가 없으면 0 (또는 NULL)이 표시됩니다.

테스트로 SELECT * FROM dt_countries c LEFT JOIN results r ON c.id = r.country 시도했지만 원하는 결과를 표시하지 않습니다.

thanks

+0

우리가 여기에서 활용할 수있는 다른 테이블 또는 테이블에 열거 된 통계/유형이 있습니까? –

+0

결과 유형이있는 테이블과 결과 값이있는 테이블이 있습니까? – linepogl

+0

여기에 활용할 수있는 다른 테이블에 통계/유형이 있습니까? 아니요, 유일한 테이블입니다 – Jon

답변

0

당신은 그 일을 지원하기 위해 테이블 ​​구조가없는 (또는, 당신이 할 경우, 당신은 테이블에 나열하지 않아도됩니다). 당신은 당신이 뒤에있어하는 세 개의 테이블입니다해야 할 일은 :

  • 국가
  • 국가

이 (참고로, SQL 테이블은 일반적으로 단수 형태로 명명 된 결과

  • 결과, 즉 Country, Result, CountryResult 등)

    나열된 내용은 다음과 같습니다. CountryCountryResult 테이블 세 번째 테이블을 가지고 있다면

    , 당신은 같은 것을 할 것 :

    select 
        c.Name as Country, 
        r.Name as Result, 
        cr.Value as Value 
    
    from Country c 
    
    cross join Result r -- We WANT a cartesian product 
    left join CountryResult cr on cr.CountryId = c.CountryId and cr.ResultId = r.ResultId 
    
  • +0

    그래서 통계 유형 목록이있는 테이블에서 작성해야합니까? – Jon

    +0

    MySQL에 대해 뭔가 이상한 것이 있습니까? 데카르트 제품을 원한다면 일반적으로 CROSS JOIN을 수행하고 "1 = 1"과 같은 이상한 일을 할 필요가 없습니까? –

    +1

    @Matt : 예, 일반적으로 'CROSS JOIN'을 사용합니다. 웬일인지, 나는 내 머리 속에 MySQL이 그들을 지원하지 않는다는 것을 알았지 만 그것은 틀린 것처럼 보인다. 내 대답을 편집했습니다. 감사! –

    0

    사용 LEFT OUTER JOIN

    SELECT * 
    FROM results r 
    LEFT OUTER JOIN dt_countries c 
        ON c.id = r.country 
    
    +0

    -1. 이것은 OP가 요구하는 것을하지 않을 것입니다; 유효한 '국가'가없는 결과 만 나열됩니다. 존재하지 않는 결과는 나열되지 않습니다. –

    +0

    다른 순서로 동일한 결과가 나타납니다. – Jon

    0
    select st.stat, st.type, r.date, c.name, r.value 
    from 
    (select distinct stat, type from results) st 
    cross join dt_countries c 
    left outer join results r on 
        c.id = r.country and r.stat = st.stat and r.type = st.type 
    order by st.stat, st.type, r.date, c.name 
    
    관련 문제