2011-09-01 7 views
0

좋아, 그래서 PHP와 MySQL을 사용하여 클랜 명단 페이지를 만들고있다. 이 쿼리에 사용할 테이블이 여러 개 있습니다. 여기 내 테이블이 배치되는 방법은 다음과 같습니다MySQL Left Join Help

  • 회원 - 일반 회원 테이블
  • roster_members - MEMBERID, 게임 ID, rosterXP (경험치 회원이 그 명단에 대한 벌었 다)
  • clan_ranks - 제목, minimumXP
  • roster_games - 회원

의 일부 특정 게임 테이블 그래서 내가 뭘 원하는 쿼리를 작성하는 것입니다 그 일족 순위에 의해 그룹의 구성원 (minimumXP 내림차순). 그들의 클랜 순위는 clan_rank minimumXP가 roster_member (WHERE minimumXP < rosterXP LIMIT 1)보다 낮은지에 의해 결정됩니다. 어떻게 이런 식으로 만들 수 있을까요? 나는 왼쪽 조인이나 오른쪽 조인을 사용해야 할 것이라고 생각한다. 차이점은 무엇인지 모르겠다. 어쨌든,이 쿼리는 내가 생각해 낸 것이지만, 작동하지 않을 것이라고 확신합니다. 누군가가 내가 무엇을 목표 이해할 수 생각

SELECT cr.id   AS crid, 
     cr.title  AS rank_title, 
     cr.minimumxp AS rank_min, 
     cr.abbreviation AS rank_abbr, 
     cr.image  AS rank_image, 
     rm.memberid  AS member_id, 
     rm.rosterxp  AS roster_xp, 
     rm.gameid  AS game_id 

FROM ".DB_PREFIX."roster_members AS rm 
LEFT JOIN ".DB_PREFIX."clan_ranks AS cr ON (cr.minimumXP < rm.rosterXP) 
WHERE rm.gameID = ".$gameID." 
GROUP BY cr.id 
ORDER BY rm.rosterXP DESC 
+0

내가 'm 정말 어려움 grokking을 가진 귀하의 단락, 그리고 귀하의 목표에 따라 확장하십시오. 아마도 당신은 다시 말하면서, 또는 더 나은 결과를 보여줄 수 있습니다 (예상되는 것을 보여주는 표) –

+0

회원 결과를 얻고 그 결과에 따라 결과를 그룹화하고 싶습니다. rosterXP. – ShoeLace1291

답변

0

내가 추가 할 필요가 무엇이든, 지적 도움이 될 수 있다면 나는 그것을 감사하겠습니다. 그렇다면 클랜 순위에 따라 그룹화하기를 원한다고 생각하지 않습니다. 상태라고 말하면 - 클랜 순위에 따라 가입을 요청하는 것 같습니다. 당신이 clan_ranks.minimumXP 가장 낮은보다 낮은 것을 roster_members.rosterXP의 값이있는 경우

SELECT rm.memberid  AS member_id, 
     rm.rosterxp  AS roster_xp, 
     rm.gameid  AS game_id, 
     cr.id   AS crid, 
     cr.title  AS rank_title, 
     cr.minimumxp AS rank_min, 
     cr.abbreviation AS rank_abbr, 
     cr.image  AS rank_image 
FROM roster_members AS rm 
LEFT JOIN clan_ranks AS cr ON cr.minimumXP = 
    (SELECT crm.minimumXP 
     FROM clan_ranks crm 
     WHERE crm.minimumXP < rm.rosterXP 
     ORDER BY minimumXP DESC limit 1) 
WHERE rm.gameID = :game_id 
ORDER BY rm.rosterXP DESC 

LEFT JOIN에만 필요합니다. 이 경우 이 아니고 인 경우 INNER JOIN이면 충분합니다. 에

  • INNER JOIN 완전히 '왼쪽'의 표에 (기록과 일치 '모두'측 기록에 결과를 제한하고 다음과 같이

    LEFT, RIGHTINNER 조인의 차이는 있습니다 조인 문의 '오른쪽'은 ON 절을 기반으로합니다.

  • LEFT JOIN에는 조인의 '왼쪽'으로 지정된 테이블에 대한 모든 레코드가 포함됩니다 (레코드가 ' '오른쪽'에 테이블에 대한 존재하지 않습니다. 레코드가 존재하지 않으면 해당 테이블에 대해 지정된 각 필드에 대해 NULL 값이 대체됩니다.
  • RIGHT JOINLEFT JOIN의 반대입니다.

필자는 필드의 위치를 ​​다시 정렬했습니다. 이는 clan_ranks의 레코드가 존재하지 않을 가능성을 고려하여 가독성을위한 것입니다. 존재하지 않으면, 첫 번째 필드에는 데이터 (roster_members)가 포함되고 결과 세트의 오른쪽에있는 필드는 NULL이됩니다. 이는 어떤 방식 으로든 요구되는 것은 아니며 단지 대회 일뿐입니다.

또한 데이터베이스 접두사를 제거하고 가독성을 위해 자리 표시자를 추가했습니다.

0

여기 까다로운 것은 회원과 클랜 순위 사이의 관계입니다.혈맹 계급이 포함한다고 가정하십시오.

title  minxp 
------  ------ 
chieftan 100 
warrior  50 
serf  5 

120 점이있는 사람은 아마도 치 에프판이 될 것입니다. 그러나 이 chieftan의 계급을 반환하는 SQL 쿼리로 구현하려고하면 조금 까다 롭습니다. 실제로 SQL 쿼리를 작성하여이를 반환 할 수는 있지만 수명이 너무 짧습니다.

클랜 순위 테이블의 구조를 title, minxp, maxxp로 변경하면 문제가 크게 단순 해집니다. 이 데이터를 유지하기위한 오버 헤드가 약간의 그러나 쿼리가 훨씬 간단합니다 : ....

title  minxp maxxp 
------  ------ ----- 
chieftan 100  999999999 
warrior  50  100 
serf  5  50 

SELECT .... 
FROM ".DB_PREFIX."roster_members AS rm 
LEFT JOIN ".DB_PREFIX."clan_ranks AS cr 
    ON (rm.rosterXP >= cr.minimumXP AND rm.rosterXP < cr.maximumXP) 
WHERE rm.gameID = ".$gameID." 
GROUP BY cr.id 
ORDER BY rm.rosterXP DESC 

은 또한 당신이 조회 기능을 사용할 수

CREATE FUNCTION getrank(p_xp INTEGER) 
    RETURNS varchar(50) CHARSET ascii 
READS SQL DATA 
BEGIN 
    DECLARE l_rank VARCHAR(50); 

    SELECT title 
    INTO l_rank 
    FROM clan_ranks 
    WHERE minxp<p_xp 
    ORDER BY minxp DESC 
    LIMIT 0,1; 

    RETURN l_rank; 
END;