2012-06-26 2 views
0

우선, 아직 MySQL에는별로 좋지 않습니다. 나는 내 질문에 어떻게 말할 지조차 모른다.평균으로 주문한 MySQL 테이블 JOIN

두 개의 테이블이 있습니다. 하나의 테이블에는 링크에 대한 정보, 사용자가 만든 각 링크의 다른 등급이 들어 있습니다. 근본적으로, 나는 다만 등급 평균에 의하여 연결 테이블을 주문할 수있을 것입니다 필요가 있습니다.

테이블 :

링크

  • LINK_ID PK의 INT의 자동 증가
  • URL VARCHAR
  • 제목 VARCHAR
  • 설명 텍스트
  • 평가 진수

link_ratings

  • link_rating_id PK의 INT의 자동 증가
  • LINK_ID FK는
  • user_i을 int로 D FK는
  • 평가를 int로 진수 누군가가 그 링크에 대한 평가의 모두는, 링크에 대한 링크 등급 (새 link_ratings 항목)를 추가하거나 현재 등급을 업데이트 할 때

은 내가해야 할 것은 링크의 등급 열에 대한 평균 및 업데이트. 또는 링크 테이블의 등급 열을 완전히 스크랩하고 JOIN을 사용할 수 있습니까?

그렇다면 JOIN을 어떻게 수행할까요? 그렇지 않다면 어떻게 이것을 수행 할 수있는 트리거를 만드나요?

SQL 지식이 부족하여 많은 정보를 찾을 수 없었습니다.

도움을 주시면 감사하겠습니다. 감사.

+0

샘플 데이터와 원하는 출력을 제공하십시오. – RedFilter

답변

3

links 테이블에 평균 rating을 유지할 필요가 없습니다. 나는 그것을 아래에서 계산하고 있습니다. 이것은 적절하게 잘 수행되어야합니다 :

select l.link_id, 
    l.url, 
    l.title, 
    l.description, 
    lra.AvgRating 
from links l 
left outer join (
    select link_id, avg(rating) as AvgRating 
    from link_ratings 
    group by link_id 
) lra on l.link_id = lra.link_id 
order by lra.AvgRating desc 
+0

사실, 합계를 시도하고 평균을내는 값은 link_ratings에서 평가됩니다. 테이블 링크의 각 링크에는 그에 대한 많은 link_rating 항목이 있습니다. – ahhchuu

+0

'rating'을 사용하도록 업데이트되었습니다. – RedFilter

+0

굉장합니다. 이것은 내가 필요한 것입니다. 고마워. 명확성을 위해 한 가지 : l => links 및 lra => link_ratings가 맞습니까? 이것은 단지 이름을 대체합니까? – ahhchuu

1

적절한 데이터 디자인은 실제로 평균 등급을 저장하지 않는다고 말합니다. 대부분의 경우 MySQL은이를 신속하게 계산할 수 있습니다. 모든 유지하여 link_ratings 그러나 당신이 MySQL's TRIGGER Documentation을 체크 아웃 할 때마다 트리거해야하는 경우, 그러나 MySQL AVG() function.

를 사용하여 평균, 실제 등급을 표시 linkslink_ratings에 가입하고 계산하는 시간을 때.다음과 같은 테스트되지 않은 의사 코드가 도움이 될 것입니다.

CREATE TRIGGER trig AFTER UPDATE ON link_ratings 
    FOR EACH ROW BEGIN 
    UPDATE links 
    SET links.rating = <new average> 
    WHERE links.link_id = NEW.link_id; 
    END; 
+0

나는 평균을 저장할 필요가 없었 으면 좋겠다. 다행 이구나. 정보 및 링크 주셔서 감사합니다. 나는 TRIGGERS를 조사 할 것이다. 그래서 내가 그들을 필요로 할 때, 나는 더 잘 이해할 것이다. – ahhchuu