【问题标题】:I want to display a summary like this based on the three tables我想根据三个表显示这样的摘要
【发布时间】:2018-11-11 11:44:31
【问题描述】:

我的3张MYSQL表如下:

表 1:公民

=============================
ID |  Name | Sex    | Address |
=============================
5  | James | Male   | India
6  | Shella|Female  | India
7  | Jan   | Male   | NY
8  | May   | Female | USA
==============================

表 2:好处

========================== 
ID| benefits
==========================
1 | SSS
2 | Coco Life
3 | PhiHealth
4 | Sunlife
==========================

表 3:养老金领取者

============================
ID| benefits_ID | citizen_ID
============================
1 | 1           | 5
2 | 2           | 6
3 | 1           | 7
4 | 4           | 7
==========================

我想显示如下:

====================================================================
Address | Total Citizen | Male | Female | SSS | Coco Life | Others |
====================================================================
India   | 2             |  1   |  1     |  1  |    1      |   0    |
NY      | 1             |  1   |  0     |  1  |    0      |   1    |
USA     | 1             |  0   |  1     |  0  |    0      |   0    | 
==================================================================

任何人都可以给我一个提示如何做到这一点?

【问题讨论】:

    标签: php mysql sql mysqli


    【解决方案1】:

    您可以使用适当的关系通过pensioners 表从Address 表到benefits 表执行Left Join。左连接将允许我们考虑Address,即使它的任何公民都没有对应的benefits 条目。

    为了统计公民总数,男性计数和女性计数,您现在需要在加入后使用COUNT(DISTINCT ID)。因为加入可能会创建重复的行,因为公民可能有多个好处。

    另外,为了计算“其他”好处,我们需要确保benefit IS NOT NULLNOT IN ('SSS', 'Coco Life')

    在多表查询中,建议使用Aliasing 以使代码清晰(可读性)并避免模棱两可的行为。

    SELECT  
      c.Address,
      COUNT(DISTINCT CASE WHEN c.Sex = 'Male' THEN c.ID END) AS male_cnt,
      COUNT(DISTINCT CASE WHEN c.Sex = 'Female' THEN c.ID END) AS female_cnt,
      COUNT(DISTINCT c.ID) AS total_citizen_cnt, 
      COUNT(CASE WHEN b.benefits = 'SSS' THEN 1 END) AS SSS_cnt, 
      COUNT(CASE WHEN b.benefits = 'Coco Life' THEN 1 END) AS Coco_Life_cnt, 
      COUNT(CASE WHEN b.benefits IS NOT NULL AND 
                      b.benefits NOT IN ('SSS', 'Coco Life') THEN 1 END) AS Others_cnt 
    FROM citizen AS c 
    LEFT JOIN pensioners AS p
      ON p.citizen_ID = c.ID 
    LEFT JOIN benefits AS b 
      ON b.ID = p.benefits_ID 
    GROUP BY c.Address
    

    【讨论】:

    • 你太快了@Madhur。 :D 让我试试这件作品。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多