php - 我想根据三个表显示这样的摘要

标签 php mysql sql mysqli

我的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    | 
==================================================================

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

最佳答案

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

为了计算总公民数、男性数和女性数,您现在需要使用 COUNT(DISTINCT ID)加入后。由于加入可能会创建重复的行,作为公民可能有不止一项好处。

此外,为了计算“其他” yield ,我们需要确保 benefit IS NOT NULL 并且它是 NOT 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

关于php - 我想根据三个表显示这样的摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53248405/

相关文章:

php - PHP OOP更新记录,但显示错误消息

php - 准备语句无法插入四个变量中的两个

php - 我工作正常的 PHP 脚本不再工作了

php - MySQL ("Sending Data"查询非常慢)

C++ ADO 连接池

sql - 对索引、主键、唯一键的影响的详细信息

php - 使用 JavaScript 更改元素 ID

php - Symfony2 一种API两种认证方式

php - 替代值应存储在 php 数组中的替代位置

sql - 限制sql查询中一列的连续值