2017-05-09 2 views
0

나는 데이터베이스에서 증기 중에 요청 된 노래를 수집합니다. 각 노래는 알려진 사용자가 요청합니다. 각 사용자가 요청한 노래를 평가할 수있는 기능을 구현하고 싶습니다.SELECT가 존재하지 않는 id에 대한 결과를 찾는다

Database model

가 지금은 노래가있어 얼마나 자주뿐만 아니라이 노래에 대한 평균 평가와 함께 자사의 ID로 식별 song_request로 명시을 선택합니다 : 당신이 내 데이터베이스 모델에서 살펴 수 상황을 감안할 때 평가. 이를 위해 나는 다음과 같은 SQL 사용하려면 :

song_request row

그리고 sr_ratings 테이블에

몇 가지 예를 들어 등급 :

sr_ratings example 내 song_requests 테이블에서

SELECT 
    sr.id, 
    sr.user_id, 
    sr.title, 
    sr.link, 
    sr.request_time, 
    COALESCE(AVG(r.rating), 0) AS rating, 
    COUNT(r.sr_id) AS votes 
FROM song_requests sr LEFT OUTER JOIN sr_ratings r 
    ON sr.id = r.sr_id 
WHERE sr.id = 12345; 

을 나는 다음과 같은 데이터가

으로 SQL을 실행하면 WHERE 절에서
sr.id = 1 

63,210 나는 다음과 같은 예상 된 결과 얻을 : 나는 지금 song_request의 ID를 사용하는 경우

query_ok_result

존재하지 않습니다

sr.id = 12345 

내가 얻을 것이다 다음 결과 :

query_bad_result

ID가 없기 때문에 쿼리에서 결과를 찾지 못할 것으로 예상됩니다. 내가 여기서 어디로 잘못 가고 있니? 원하는 결과를 얻으려면 무엇을해야합니까?

+0

문제는 왼쪽 조인입니다. –

+1

(1) 사용중인 데이터베이스에 질문에 태그를 답니다. (2) 내부 조인으로 전환하면됩니다. –

+0

내부 조인은 정확히 같은 결과를 반환합니다. – IonicBlaze

답변

3

여기에는 여러 가지 문제가 있습니다. 첫째, 코드는 다른 어떤 데이터베이스에서도 가짜이기 때문에 MySQL을 사용하고 있습니다. 집계되지 않은 열과 함께 집계 함수가 있고 GROUP BY 절이 없습니다.

SELECT sr.id, sr.user_id, sr.title, sr.link, sr.request_time, 
     COALESCE(AVG(r.rating), 0) AS rating, 
     COUNT(r.sr_id) AS votes 
FROM song_requests sr LEFT OUTER JOIN 
    sr_ratings r 
    ON sr.id = r.sr_id 
WHERE sr.id = 12345 
GROUP BY sr.id, sr.user_id, sr.title, sr.link, sr.request_time; 

짜잔 :

난 당신이 뭔가를 원하는 추측하고있다! 이것으로 문제가 해결된다는 것을 알게 될 것입니다. 그러면 행이 반환되지 않습니다.

GROUP BY이 아닌 집계 쿼리이기 때문에 코드에서 한 행을 반환합니다. 일치가없는 경우에도 항상 정확히 하나의 행을 반환합니다. 문제는 LEFT JOIN이 아닙니다. GROUP BY의 잘못된 사용입니다.

+0

정말로 고쳐주었습니다. 정말 고마워요. AVG 또는 COUNT와 같은 집계 함수를 사용하면 그룹을 사용해야 함을 의미합니다. – IonicBlaze

+0

@IonicBlaze. . . 일반적으로'GROUP BY'를 사용합니다. 그렇지 않으면 항상 하나의 행을 가져옵니다. –

0

LEFT JOIN 또는 LEFT OUTER JOIN 키워드는 왼쪽 테이블의 모든 레코드와 오른쪽 테이블의 일치하는 레코드를 반환합니다. 결과가 일치하지 않으면 오른쪽에서 NULL입니다.

CASE 문으로 사용해 볼 수 있습니다. 당신에게 대답 할 수있는 또 다른 질문이 있습니다. How to select all values and hide NULL values in SQL?

관련 문제