连接并计数mysql中的行值


Join and count rows value in mysql?

我有两个表在我的数据库(第一个名字- game_table和第二个名字- attendee_table):

/ ---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  |

我想要以下结果:

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

所以我使用以下查询:

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   |

如果没有分割组的模式(例如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

可以使用select case

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

game_table对于您的查询目的似乎没有发挥重要作用。您必须使用内联年龄"桶"表作为查询的第一个表,然后对其使用LEFT JOIN attendee_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)))