2013-03-29 2 views
2

나는 내가 놀고있는 사람들을위한 골프에 관한 통계 페이지를 만들고 있습니다. 나는 우리가 버디 (-1 파 아래)를받은 모든 스코어 카드 중에서 데이터베이스를 빠져 나오려하고있다. 그것은 홀당 -1 개를 뽑아 내지 만 스코어 카드에 2 버디가 있다면 2 버디로 1 버디로 계산됩니다. 나는 카운트를 계속하고 싶습니다. 그래서 누군가 9 버디를 얻는다면, 9가 합계에 추가됩니다.카운트 값은 각 행마다 1을받습니다.

$query_p321 = "SELECT t1.*,COUNT(t1.player_id),t2.* FROM scorecards t1 LEFT JOIN courses t2 ON t1.course_id=t2.course_id 
WHERE t1.hole1<t2.hole1_par AND t1.hole1>t2.hole1_par-2 
    OR t1.hole2<t2.hole2_par AND t1.hole2>t2.hole2_par-2 
    OR t1.hole3<t2.hole3_par AND t1.hole3>t2.hole3_par-2 
    OR t1.hole4<t2.hole4_par AND t1.hole4>t2.hole4_par-2 
    OR t1.hole5<t2.hole5_par AND t1.hole5>t2.hole5_par-2 
    OR t1.hole6<t2.hole6_par AND t1.hole6>t2.hole6_par-2 
    OR t1.hole7<t2.hole7_par AND t1.hole7>t2.hole7_par-2 
    OR t1.hole8<t2.hole8_par AND t1.hole8>t2.hole8_par-2 
    OR t1.hole9<t2.hole9_par AND t1.hole9>t2.hole9_par-2 
    OR t1.hole10<t2.hole10_par AND t1.hole10>t2.hole10_par-2 
    OR t1.hole11<t2.hole11_par AND t1.hole11>t2.hole11_par-2 
    OR t1.hole12<t2.hole12_par AND t1.hole12>t2.hole12_par-2 
    OR t1.hole13<t2.hole13_par AND t1.hole13>t2.hole13_par-2 
    OR t1.hole14<t2.hole14_par AND t1.hole14>t2.hole14_par-2 
    OR t1.hole15<t2.hole15_par AND t1.hole15>t2.hole15_par-2 
    OR t1.hole16<t2.hole16_par AND t1.hole16>t2.hole16_par-2 
    OR t1.hole17<t2.hole17_par AND t1.hole17>t2.hole17_par-2 
    OR t1.hole18<t2.hole18_par AND t1.hole18>t2.hole18_par-2 
GROUP BY t1.player_id ORDER BY count(t1.player_id) DESC"; 
$result_p321 = mysql_query($query_p321); 
$number = 1; 
while ($row_p321 = mysql_fetch_array($result_p321)) { 
    $player_id2 = $row_p321["player_id"]; 
    } 
and so on.. 

거기에 "-2"가 표시됩니다. 그 사람이 2 스트로크인지 기록하고 싶지 않기 때문에 그것은 파 마이너스 2를 취하고 있습니다. 밑에 한 발 치기 만하면 돼. 어떤 도움을 주셔서 감사합니다. 고맙습니다. 아, 또한, 플레이어 이름을 두 번 이상 나열하지 않으려면 GROUP BY를 사용해야합니다. 모든 버디를 세고 싶을뿐입니다. 내 큰 문제는 행당 1 개 이상을 계산하지 않는다는 것입니다. 감사. 그런

+0

정보를 저장하는 테이블에 대한 설명을 제공 할 수 있습니까? 매우 쉬운 문제로 인해 쿼리가 매우 복잡해 보입니다. –

+1

거기에 브래킷이 필요합니다 ... – MichaelRushton

+1

't1.hole1 t2.hole1_par-2'을 찾고 있습니다. 더 간단 할 것입니다. 't1.hole1 = t2.hole1_par-1'에 대해. 그러나 근본적인 질문에 대답하기 위해'COUNT (t1.player_id)'를'COUNT (*) '로 변경하면 문제가 해결 될 것이라고 생각합니다. – EvilBob22

답변

0

시도 뭔가 :

SELECT t1.*, SUM(IF(t1.hole1 = t2.hole1_par-1,1,0) + 
     IF(t1.hole2 = t2.hole2_par-1,1,0) + 
     IF(t1.hole3 = t2.hole3_par-1,1,0) + 
     IF(t1.hole4 = t2.hole4_par-1,1,0) + 
     -- etc. 
     IF(t1.hole18 = t2.hole18_par-1,1,0)) AS birdies 
FROM scorecards t1 
LEFT JOIN courses t2 ON t1.course_id=t2.course_id 
GROUP BY t1.player_id 
ORDER BY birdies DESC 
+0

완벽한 작업. 정말 고맙습니다! – Rmurp006

+0

'IF (t1.hole1 NOT NULL && t1.hole1 = t2.hole1_par, 1,0)'해야합니다. 천만에요. – didierc

+0

아름다운. 다시 한번 감사드립니다. – Rmurp006

1

문제는 where 절입니다. 당신은 그 (것)를 계산하기 위해 select 절에 비교를 수행해야합니다

SELECT t1.*, 
     sum((t1.hole1 = t2.hole1_par - 1) + 
      (t1.hole2 = t2.hole2_par - 1) + 
      . . . 
      (t1.hole18 = t2.hole18_par - 1) 
     ) as birdies 
FROM scorecards t1 LEFT JOIN 
    courses t2 ON t1.course_id=t2.course_id 
GROUP BY t1.player_id 
ORDER BY birdies DESC 

이 1 거짓 0은 숫자까지를 추가하는 것입니다 진정한 MySQL의 규칙을 사용합니다. 표준 SQL을 사용하는 다른 공식은 다음과 같습니다.

 sum((case when t1.hole1 = t2.hole1_par - 1) then 1 else 0 end) + 
+0

도움을 주셔서 감사합니다! – Rmurp006

관련 문제