2016-10-13 4 views
3

は、私は私のデータベースに( - game_tableと第二名 - 姓をattendee_table)2台を持っている:私は次のクエリを使用していますそのためので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 | 

私は次のような結果が欲しい

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") 

しかし、このクエリは、次のような出力を返します。

| a_age | Count | 
| 10 | 1 | 
| 15 | 1 | 
| 25 | 1 | 
| 31 | 2 | 
| 35 | 1 | 
| 40 | 1 | 

はので、どのように私は以下のように私の結果を取ることができます:

| 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

グループを分割するにはパターンが存在しない場合(例えば、 18年のグループの場合ではありません)、私はあなたがCASE EXPRESSIONを使用して行うことができ、条件のグループ化を使用する必要が思う:

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と同じです。.. so thanks thanks friend –

+0

@SantoshKhatri correct .. sagiが最初に答えました。ありがとう – scaisEdge

0

game_table選択ケースを使用することができませんあなたの質問の目的のために重要な役割を果たしていないようです。あなたは、行でも何の関連レコードを持たない年齢バケットに返されますようにするには、それにattendee_tableLEFT JOIN、その後、クエリの最初のテーブルとしてのインライン時代「バケツ」テーブルを使用する必要があります。

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))) 
関連する問題