簡體   English   中英

在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年的EG組不是這種情況)那么我認為你必須使用條件分組,這可以使用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

你可以使用精選案例

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似乎並不是您查詢的重要角色。 您必須使用內聯年齡'bucket'表作為查詢的第一個表,然后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))) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM