··조회 12,434
오랜만에 질문드립니다.
야구기록실 관련해서 여러가지 질문드렸던 사람입니다.
손병목님과 두리뭉실님 덕분에 성공했습니다.^.^ 지금 칭찬이 자자합니다.
잘만들었다고요.. 감사드립니다.
기록정렬과 관련되어서 질문이 있어서 글을 남깁니다.
http://www.yagootj.com/record_batter/list_batter.php
질문1. 누적타율계산시 소수점 3자리까지 표시하려면...========================================
ab->타수 hit->안타
$query="select sum(ab) as s_ab,sum(hit) as s_hit,sum(hit)/sum(ab) as s_hra from $tablename ".$que_league." ".$and." ".$que_team1." GROUP BY name,team1,league order by $select_arrange_s $desc limit $offset, $list_num";
이러케하니까 s_hra값이 소수점 두자리값으로 정해져 버리더라구요.
$s_hra = (number_format($array[s_hra],3));
이변수를 추가해도 세자리소수점은 0으로표시가됩니다.
그래서 sum(hit)/sum(ab) as s_hra을 없애고
$s_hra = (number_format($array[s_hit]/$array[s_ab],3)); 를 넣으면
소수점 3자리까지 정상표시되긴하는데, s_hit하고 s_ab값이 0 인 선수는
Warning: Division by zero in /home/triple/yagootj/record_batter/list_batter.php on line 339
이런식으로 계산오류라고 뜨더군요.
계산오류도 안뜨게 하고 소수점 3자리까지 표시되게 하는방법이 없을까요?
질문2.-==================================================================================
기록을 s_hra 에 의해 정렬시켰는데, s_ab 값과 s_hit값이 0인 선수가 최상위로 정렬이 되더군요. 아마 0/0 이면 무한대가 표시되서 그런거 같은데 해결방법은 없는지요.
질문3. 정렬순서의 복수지정..===============================================================
현재 초기정렬값이 s_hra입니다. 이때 s_hra 값이 같은 두선수가 있을땐 s_hit값이 더큰 선수를 상위 정렬시키고자 합니다.
즉.-----s_ab s_hit s_hra
강호동 12 6 0.500
유재석 10 5 0.500
s_hra값이 같으면 s_hit값이 큰선수를 상위정렬시키려고합니다.
질문4. 규정타수 우선정렬===================================================================
3번질문과 비슷한 내용이 될것 같은데요.
s_ab값이 정해진 숫자(규정타수-변수처리) 이상인 선수를 우선적으로 정렬한다음, 정해진숫자이하인 선수를 그이하로 정렬하는방법은 없는지요.
질문5. 순위 매기기=========================================================================
이건 제가 해봐서 순위매기기는 가능했는데.. 순서대로 그냥 주욱---1,2,3,4,---이러케 됬습니다.
이러케 변수처리 했거든요
$no=0;
$no=$no+1;
http://www.yagootj.com/record_result/list_rank.php?league=4
승률에 의해 정렬시키로 그에 따라 순위를 부여했는데요.
승률이 같으면 같은순위가 표시되게 하려고 합니다.
순위 팀 승률 ----
1 A 1.000
1 B 1.000
1 C 1.000
4 D 0.900
4 E 0.900
6 F 0.800
이런식으로 표현되게 하려고 합니다.
어떻게 해야 할런지요..
=========================================================================================
오늘 너무 많은 질문을 드렸네요.. 그동안 혼자서 끙끙대다가 너무 안풀려서 도움을 구합니다. ^.^
항상 친절한 답변 감사드립니다 꾸벅
손병목님과 두리뭉실님 덕분에 성공했습니다.^.^ 지금 칭찬이 자자합니다.
잘만들었다고요.. 감사드립니다.
기록정렬과 관련되어서 질문이 있어서 글을 남깁니다.
http://www.yagootj.com/record_batter/list_batter.php
질문1. 누적타율계산시 소수점 3자리까지 표시하려면...========================================
ab->타수 hit->안타
$query="select sum(ab) as s_ab,sum(hit) as s_hit,sum(hit)/sum(ab) as s_hra from $tablename ".$que_league." ".$and." ".$que_team1." GROUP BY name,team1,league order by $select_arrange_s $desc limit $offset, $list_num";
이러케하니까 s_hra값이 소수점 두자리값으로 정해져 버리더라구요.
$s_hra = (number_format($array[s_hra],3));
이변수를 추가해도 세자리소수점은 0으로표시가됩니다.
그래서 sum(hit)/sum(ab) as s_hra을 없애고
$s_hra = (number_format($array[s_hit]/$array[s_ab],3)); 를 넣으면
소수점 3자리까지 정상표시되긴하는데, s_hit하고 s_ab값이 0 인 선수는
Warning: Division by zero in /home/triple/yagootj/record_batter/list_batter.php on line 339
이런식으로 계산오류라고 뜨더군요.
계산오류도 안뜨게 하고 소수점 3자리까지 표시되게 하는방법이 없을까요?
질문2.-==================================================================================
기록을 s_hra 에 의해 정렬시켰는데, s_ab 값과 s_hit값이 0인 선수가 최상위로 정렬이 되더군요. 아마 0/0 이면 무한대가 표시되서 그런거 같은데 해결방법은 없는지요.
질문3. 정렬순서의 복수지정..===============================================================
현재 초기정렬값이 s_hra입니다. 이때 s_hra 값이 같은 두선수가 있을땐 s_hit값이 더큰 선수를 상위 정렬시키고자 합니다.
즉.-----s_ab s_hit s_hra
강호동 12 6 0.500
유재석 10 5 0.500
s_hra값이 같으면 s_hit값이 큰선수를 상위정렬시키려고합니다.
질문4. 규정타수 우선정렬===================================================================
3번질문과 비슷한 내용이 될것 같은데요.
s_ab값이 정해진 숫자(규정타수-변수처리) 이상인 선수를 우선적으로 정렬한다음, 정해진숫자이하인 선수를 그이하로 정렬하는방법은 없는지요.
질문5. 순위 매기기=========================================================================
이건 제가 해봐서 순위매기기는 가능했는데.. 순서대로 그냥 주욱---1,2,3,4,---이러케 됬습니다.
이러케 변수처리 했거든요
$no=0;
$no=$no+1;
http://www.yagootj.com/record_result/list_rank.php?league=4
승률에 의해 정렬시키로 그에 따라 순위를 부여했는데요.
승률이 같으면 같은순위가 표시되게 하려고 합니다.
순위 팀 승률 ----
1 A 1.000
1 B 1.000
1 C 1.000
4 D 0.900
4 E 0.900
6 F 0.800
이런식으로 표현되게 하려고 합니다.
어떻게 해야 할런지요..
=========================================================================================
오늘 너무 많은 질문을 드렸네요.. 그동안 혼자서 끙끙대다가 너무 안풀려서 도움을 구합니다. ^.^
항상 친절한 답변 감사드립니다 꾸벅
댓글 6
select sum(ab) as s_ab,sum(hit) as s_hit,sum(hit)/sum(ab) as s_hra..... 에서
sum(hit)/sum(ab) 부분을 round(sum(hit)/sum(ab),3)와 같이 바꿔보세요. 아마 될 겁니다.
0타수 0안타의 값은 엄격하게 말하면 오류인데, 실제 s_hra값에는 NULL 값이 입력됩니다. 따라서 NULL의 값은 0보다 작게 취급되어, 내림차순으로 정렬하면 가장 낮게, 올림차순으로 정렬하면 가장 높게 표시됩니다.
제가 테스트해본 결과 그렇습니다.
s_hra 기준으로 내림차순, s_hit 기준으로 내림차순을 동시에 적용하면 됩니다.
ORDER BY s_hra DESC, s_hit DESC 라고 하면 됩니다.
질문 2의 경우
http://www.yagootj.com/record_batter/list_batter.php?league=2 의 경우입니다. 0타수 0안타의 선수가 가장위에 정렬이 됩니다.
$query="select 중략 name,sum(ab) as s_abi,sum(hit) as s_hit,round(sum(hit)/sum(ab),3) as s_hra 중략 from $tablename ".$que_league." ".$and." ".$que_team1." GROUP BY name,team1,league order by $select_arrange_s desc, s_hit DESC limit $offset, $list_num"; // SQL 쿼리문
$select_arrange_s 의 변수처리는 다음과 같이 했습니다.
if($select_arrange_s=="") {$select_arrange_s="s_hra";}
====================================================
5번질문에 대한 답도 부탁드립니다.^.^
항상 감사합니다.
이건 설명이 좀 복잡합니다. 배열을 이용해야할 것 같네요.
만약 승률의 값이 $현재승률에 저장된다고 가정합니다. 지난 승률,즉 바로 전의 승률은 $승률에 저장된다고 가정하구요.
순위는 $grade 배열변수를 사용합니다(현재는 $no를 사용했죠?). 대신 $no는 첨자로 사용합니다.
$no는 단순한 순서만을 나타냅니다. 따라서 $grade[1]이면 첫번째 값의 순위라는 뜻이죠. 이건 당연히 1이 되겠죠.
$grade[2]는 두번째 순위라는 뜻인데, 이것은 2가 될 수도 있고 첫번째 값과 동일하면 1이 될 수도 있는 겁니다.
예를 들어, 만약 $no가 1이면
$grade[$no] = $no ; // → $grade[1] = 1; 과 동일한 뜻입니다.
승률이 모두 다르다면,
$grade[2] = 2
$grade[3] = 3 과 같이 진행되겠지만,
만약 네번째 승률이 세번째 승률과 동일하다면
$grade[4] = 3 과 같이, 네번째 순위($grade[4])에도 전순위(3)의 값이 저장되어야 합니다.
이것을 코딩하면 대략 다음과 같습니다.
$no = 1;
while(...) { // 반복문 시작
$현재승률 = 현재승률;
if($현재승률 == $승률) {
$grade[$no] = $grade[$no-1];
} else {
$grade[$no] = $no;
}
$승률 = $현재승률;
$no = $no+1;
} // 반복문 끝
뭐가 좀 빠진 것 같지만, 하여튼 순위를 배열에 저장시키면서, 이전의 값과 비교해야 하는 것은 맞습니다.
한번 시도해보세요...