我的两个mysql表如下:
表1:公民
=============================
ID | Name | Sex | Address |
=============================
5 | James | Male | India
6 | Shella|Female | India
7 | Jan | Male | NY
8 | May | Female | USA
==============================
表2:效益
==========================
ID| citizen_ID | benefits
==========================
1 | 5 | SSS
2 | 6 | Coco Life
3 | 7 | SSS
4 | 7 | Sunlife
==========================
我想显示如下:
====================================================================
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 |
==================================================================
谁能告诉我怎么做?我的初始代码:
$sql = "SELECT Address,
count(case when Sex='Male' then 1 end) as male_cnt,
count(case when Sex='Female' then 1 end) as female_cnt,
count(*) as total_cnt FROM citizen
GROUP BY Address";
2条答案
按热度按时间vom3gejh1#
经过无数个小时的测试,从猫那里得到了代码编写、萨满歌曲演唱等方面的帮助。。。我想我做了一个测试,给出了期望的结果。我测试了一下,它似乎起作用了。
然而,不管我做了什么,单靠sql是不足以完成这项工作的。在绝望中,我不得不使用php来实现。即使使用php,它也被证明是一个挑战。
下面我主要使用php来粘贴我对这个问题的看法。我只希望它能帮助一些人或者给一些人一些关于重构代码和简化逻辑的好主意。
为了更容易理解这段代码的功能,我尽可能多地添加了注解。
soat7uwm2#
你在正确的轨道上。你现在只需要做一个
Left Join
从Address
餐桌benefits
table。左连接将允许我们考虑Address
即使没有相应的benefits
任何公民的入境。为了计算公民总数,男性人数和女性人数,现在需要使用
COUNT(DISTINCT ID)
加入之后。因为加入可能会产生重复的行,因为一个公民可能有多个好处。此外,为了计算“其他”好处,我们需要确保
benefit IS NOT NULL
是的NOT IN ('SSS', 'Coco Life')
.在多表查询中,建议使用别名以提高代码的清晰度(可读性)并避免模棱两可的行为。