2016-10-13 2 views
3

나는 내 데이터베이스 (- game_table 및 두 번째 이름 - 이름을 attendee_table) 두 개의 테이블이 : 난 다음 쿼리를 사용하고 그것에 대해 너무mysql에서 조인 및 행 값을 계산 하시겠습니까?

| age_break_up | Count | 
| 0 - 18 years | 2 | 
| 19 - 25 years | 1 | 
| 26 - 40 years | 4 | 
| 41+ years  | 0 | 

:

/ ---game_table-- \     /-- Attendee_table -- \ 
| g_id | g_name |    | a_id | g_id | a_name | a_age | 
| 101 | football |    | 1 | 101 | Santosh | 31 | 
| 102 | Cricket |    | 2 | 101 | Parveen | 35 | 
| 102 | Hockey |    | 3 | 101 | Ram  | 15 | 
            | 4 | 101 | Radhe | 10 | 
            | 5 | 101 | Salim | 31 | 
            | 6 | 101 | sandeep | 25 | 
            | 7 | 101 | Rahul | 40 | 

나는 다음과 같은 결과를 원하는

0,123,220 :
mysqli_query($con, "SELECT f.a_age, COUNT(f.a_age) FROM game_table t INNER JOIN attendee_table f ON t.g_id = f.g_id GROUP BY f.a_age") 

그러나이 쿼리는 다음과 같은 출력을 반환

그래서 내가 어떻게 아래처럼 내 결과를 수행 할 수 있습니다

| age_break_up | Count | 
| 0 - 18 years | 2 | 
| 19 - 25 years | 1 | 
| 26 - 40 years | 4 | 
| 41+ years  | 0 | 
+0

를 @ JayBlanchard이 쿼리를 사용하고 있습니다. mysqli_query ($ con, "SELECT f.a_age, COUNT (f.a_age) FROM game_table t INNER JOIN attendee_table f ON t.g_id = f.g_id GROUP BY f.a_age") –

+0

@JayBlanchard 나는 내 질문에 추가했습니다. –

답변

3

그룹을 분할에 아무런 패턴이없는 경우 (예를 들어,

SELECT CASE WHEN f.a_age < 19 THEN '0 - 18 years' 
      WHEN f.a_age between 19 and 25 THEN '19 - 25 years' 
      WHEN f.a_age between 26 and 40 THEN '26 - 40 years' 
      ELSE '41+ years' 
     end as age_break_up, 
     COUNT(f.a_age) 
FROM game_table t 
INNER JOIN attendee_table f 
ON t.g_id = f.g_id 
GROUP BY CASE WHEN f.a_age < 19 THEN '0 - 18 years' 
       WHEN f.a_age between 19 and 25 THEN '19 - 25 years' 
       WHEN f.a_age between 26 and 40 THEN '26 - 40 years' 
       ELSE '41+ years' 
     END 
+0

깜짝 놀랄만 한 친구입니다 .. 고마워요. –

1

당신이

mysqli_query($con, "SELECT 
        case when f.a_age between 0 and 18 then '0 - 18 years' 
         when f.a_age between 19 and 25 then '19 - 25 years' 
         when f.a_age between 26 and 40 then '26 - 40 years' 
              else '26 - 40 years' 
        end as age_break_up 
        , COUNT(f.a_age) 
       FROM game_table t 
       INNER JOIN attendee_table f ON t.g_id = f.g_id 
       GROUP BY case when f.a_age between 0 and 18 then '0 - 18 years' 
         when f.a_age between 19 and 25 then '19 - 25 years' 
         when f.a_age between 26 and 40 then '26 - 40 years' 
              else '26 - 40 years' 
        end ;") 
+0

당신의 코드는 sagi와 똑같습니다. .. 감사합니다. –

+0

@SantoshKhatri correct .. sagi가 처음으로 대답했습니다. .. thanks – scaisEdge

0

game_table가 수행하는 선택 경우를 사용할 수 있습니다 그렇지 않은 18 세 그룹은) 나는 당신이 CASE EXPRESSION을 사용하여 수행 할 수 있습니다 조건 그룹화를 사용하는 것 같아요 귀하의 질의를 위해 중요한 역할을하지 않는 것 같습니다. 당신은 당신이 행에는 관련 기록이없는 시대 버킷에 대해서도 반환받을 수 있도록, 그것을 다음, 쿼리의 첫 번째 테이블로 LEFT JOINattendee_table을 인라인 시대 '버킷'테이블을 사용할 수 있습니다

SELECT CASE t1.age_bucket 
      WHEN 1 THEN '0 - 18 years' 
      WHEN 2 THEN '19 - 25 years' 
      WHEN 3 THEN '26 - 40 years' 
      ELSE '41+ years' 
     END AS age_break_up,  
     COUNT(t2.a_age)    
FROM (SELECT 1 AS age_bucket UNION ALL SELECT 2 UNION ALL 
     SELECT 3 UNION ALL SELECT 4) AS t1 
LEFT JOIN atendee_table AS t2 ON t1.age_bucket = IF(t2.a_age BETWEEN 0 AND 18, 1, 
                IF(t2.a_age BETWEEN 19 AND 25, 2, 
                IF(t2.a_age BETWEEN 26 AND 40, 3, 4))) 
GROUP BY IF(a_age BETWEEN 0 AND 18, 1, 
      IF(a_age BETWEEN 19 AND 25, 2, 
       IF(a_age BETWEEN 26 AND 40, 3, 4))) 
관련 문제