Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 计算表中联接和组结果中的字段数_Mysql_Join - Fatal编程技术网

Mysql 计算表中联接和组结果中的字段数

Mysql 计算表中联接和组结果中的字段数,mysql,join,Mysql,Join,我有一张表格,里面有关于原籍国、出生、国籍和性别的数据 PEOPLE +-----------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+--------------+------+-----+

我有一张表格,里面有关于原籍国、出生、国籍和性别的数据

PEOPLE
+-----------------------+--------------+------+-----+---------+----------------+
| Field                 | Type         | Null | Key | Default | Extra          |
+-----------------------+--------------+------+-----+---------+----------------+
| id                    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name                  | varchar(200) | YES  |     | NULL    |                |
| surname               | varchar(200) | YES  |     | NULL    |                |
| sex                   | varchar(1)   | YES  |     | NULL    |                |
| idNatBirth            | int(11)      | YES  | MUL | NULL    |                |
| idNatOrigin           | int(11)      | YES  | MUL | NULL    |                |
| idNatCitizen          | int(11)      | YES  | MUL | NULL    |                |
+-----------------------+--------------+------+-----+---------+----------------+
国家ID(出生、原籍、公民身份)将加入国家表:

NATIONS
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| code        | bigint(20)   | YES  |     | NULL    |                |
| description | varchar(100) | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
我已经得到了三张按国家统计人口的表格。 三个国家的油田采用相同的模式。这是为了出生:

select people.idNatBirth, nations.*, count(*) FROM people
INNER JOIN nations
ON nations.id = people.idNatBirth
GROUP BY nations.description;

+------------------+-----+--------+-------------+----------+
| idNatBirth       | id  | code   | description | count(*) |
+------------------+-----+--------+-------------+----------+
|              133 | 133 |      1 | AFGHANISTAN |       43 |
|              193 | 193 |     61 | IRAQ        |      139 |
|              219 | 219 |     87 | PAKISTAN    |       59 |
|              238 | 238 |    106 | SIRIA       |      161 |
+------------------+-----+--------+-------------+----------+
但我需要一个更复杂的结果,显示出生、出身、国籍和性别分布。 诸如此类:

+------------------------+----------+------------+----------+------------+------------+-----------+------------+
| description            | birth    | birthMale  | birthFem | origin     | originMale | originFem | citizenship    etc .....      
+------------------------+----------+------------+----------+------------+------------+-----------+------------+
| AFGHANISTAN            |       43 |         20 |       23 |         40 |         20 |        20 |    ....
| IRAQ                   |      139 |         39 |      100 |         29 |          9 |        20 |    ....
| PAKISTAN               |       59 |         50 |        9 |         10 |          9 |         1 |    .... 
| SIRIA                  |      161 |         61 |      100 |        102 |          2 |       100 |    ....
| ALBANIA                |        0 |          0 |        0 |         12 |         10 |         2 |    ....
| SOMALIA                |        0 |          0 |        0 |      ...
...
...
正如你所看到的,并不是每个国家都出现在每个领域的人口统计表中。。。 你知道如何做到这一点吗? 提前谢谢。 这是人员表的示例数据:

+----+------------+------------+-------+------------------+----------------------+-----------------------+
| id | name       | surname    | sex   | idNatBirth       | idNatOrigin          | idNatCitizen          |
+----+------------+------------+-------+------------------+----------------------+-----------------------+
|  1 | name       | surname    | M     |              133 |                 NULL |                  NULL |
|  2 | AUTOS1     | AUTOS2     | M     |              133 |                 NULL |                  NULL |
|  3 | Johari     | JAI        | F     |              193 |                  238 |                   193 |
|  4 | Bejide     | RAI        | F     |              193 |                  193 |                   193 |
|  5 | Sema       | DARSHA     | M     |              238 |                  238 |                   238 |
|  6 | Kefilwe    | LATA       | M     |              219 |                  219 |                   219 |
|  7 | Kali       | RAJAN      | M     |              238 |                  238 |                   238 |
|  8 | Tanginika  | SAXENA     | F     |              193 |                  193 |                   193 |
|  9 | Marahaba   | CHAUHAN    | M     |              238 |                  238 |                   238 |
| 10 | Malkia     | PATEL      | M     |              238 |                  238 |                   238 |
| 11 | Makena     | DHAWAN     | F     |              193 |                  193 |                   193 |
| 12 | Dziko      | NARAYAN    | M     |              238 |                  238 |                   238 |
| 13 | Anaya      | NEEL       | M     |              193 |                  193 |                   193 |
| 14 | Yahminah   | SANDEEP    | M     |              238 |                  238 |                   238 |
| 15 | Iruwa      | SEN        | M     |              219 |                  219 |                   219 |
| 16 | Abena      | MATI       | M     |              133 |                  133 |                   133 |
| 17 | Obax       | BHATT      | M     |              193 |                  193 |                   193 |
| 18 | Bikilu     | NATH       | F     |              133 |                  133 |                   133 |
| 19 | Mumbi      | SRINI      | M     |              219 |                  219 |                   219 |
| 20 | Wanjiko    | MANJU      | M     |              193 |                  238 |                   193 |
+----+------------+------------+-------+------------------+----------------------+-----------------------+
你可以在下面试试

SELECT description,
       SUM(birth)       birth,
       SUM(birthmale)   birthMale,
       SUM(birthfem)    birthFem,
       SUM(origin)      origin,
       SUM(originmale)  originMale,
       SUM(originfem)   originFem,
       SUM(citizenship) citizenship,
       SUM(citizenmale) citizenMale,
       SUM(citizenfem)  citizenFem
FROM  (SELECT CASE
                WHEN n.id IS NOT NULL THEN n.description
                WHEN org.id IS NOT NULL THEN org.description
                WHEN cit.id IS NOT NULL THEN cit.description
              END      description,
              SUM(CASE WHEN n.id IS NOT NULL THEN 1 ELSE 0 END) AS birth,
              SUM(CASE WHEN n.id IS NOT NULL AND people.sex = 'M' THEN 1 ELSE 0 END) birthmale,
              SUM(CASE WHEN n.id IS NOT NULL AND people.sex = 'F' THEN 1 ELSE 0 END) birthFem,
              SUM(CASE WHEN org.id IS NOT NULL THEN 1 ELSE 0 END) AS origin,
              SUM(CASE WHEN org.id IS NOT NULL AND people.sex = 'M' THEN 1 ELSE 0 END) originmale,
              SUM(CASE WHEN org.id IS NOT NULL AND people.sex = 'F' THEN 1 ELSE 0 END) originFem,
              SUM(CASE WHEN cit.id IS NOT NULL THEN 1 ELSE 0 END) AS citizenship,
              SUM(CASE WHEN cit.id IS NOT NULL AND people.sex = 'M' THEN 1 ELSE 0 END) citizenmale,
              SUM(CASE WHEN cit.id IS NOT NULL AND people.sex = 'F' THEN 1 ELSE 0 END) citizenFem
       FROM   people
              LEFT JOIN nations n
                     ON n.id = people.idnatbirth
              LEFT JOIN nations org
                     ON org.id = people.idnatorigin
              LEFT JOIN nations cit
                     ON cit.id = people.idnatcitizen
       GROUP  BY n.id,
                 org.id,
                 cit.id,
                 n.description,
                 org.description,
                 cit.description)t1
GROUP  BY description; 
希望这能帮到你。这确实是一个简单的查询。格式化查询就像魔鬼查询一样。

您可以在下面尝试

SELECT description,
       SUM(birth)       birth,
       SUM(birthmale)   birthMale,
       SUM(birthfem)    birthFem,
       SUM(origin)      origin,
       SUM(originmale)  originMale,
       SUM(originfem)   originFem,
       SUM(citizenship) citizenship,
       SUM(citizenmale) citizenMale,
       SUM(citizenfem)  citizenFem
FROM  (SELECT CASE
                WHEN n.id IS NOT NULL THEN n.description
                WHEN org.id IS NOT NULL THEN org.description
                WHEN cit.id IS NOT NULL THEN cit.description
              END      description,
              SUM(CASE WHEN n.id IS NOT NULL THEN 1 ELSE 0 END) AS birth,
              SUM(CASE WHEN n.id IS NOT NULL AND people.sex = 'M' THEN 1 ELSE 0 END) birthmale,
              SUM(CASE WHEN n.id IS NOT NULL AND people.sex = 'F' THEN 1 ELSE 0 END) birthFem,
              SUM(CASE WHEN org.id IS NOT NULL THEN 1 ELSE 0 END) AS origin,
              SUM(CASE WHEN org.id IS NOT NULL AND people.sex = 'M' THEN 1 ELSE 0 END) originmale,
              SUM(CASE WHEN org.id IS NOT NULL AND people.sex = 'F' THEN 1 ELSE 0 END) originFem,
              SUM(CASE WHEN cit.id IS NOT NULL THEN 1 ELSE 0 END) AS citizenship,
              SUM(CASE WHEN cit.id IS NOT NULL AND people.sex = 'M' THEN 1 ELSE 0 END) citizenmale,
              SUM(CASE WHEN cit.id IS NOT NULL AND people.sex = 'F' THEN 1 ELSE 0 END) citizenFem
       FROM   people
              LEFT JOIN nations n
                     ON n.id = people.idnatbirth
              LEFT JOIN nations org
                     ON org.id = people.idnatorigin
              LEFT JOIN nations cit
                     ON cit.id = people.idnatcitizen
       GROUP  BY n.id,
                 org.id,
                 cit.id,
                 n.description,
                 org.description,
                 cit.description)t1
GROUP  BY description; 

希望这能帮到你。这确实是一个简单的查询。格式化查询就像魔鬼查询一样。

您能提供
人员表中的一些示例数据吗?谢谢!刚刚编辑了我的帖子…你能提供一些
表格中的样本数据吗?谢谢!刚刚编辑了我的帖子…快到了!谢谢唯一的问题是,结果只涉及国家在各个领域的表现。几乎就在那里!谢谢问题是,查询实际上只列出了出现在每个字段中的国家:因此我无法看到,例如,出现在公民身份字段中的国家。。。我需要查看与这三个领域中任何一个领域相关的所有国家…@Take小姐,你有这种情况的样本数据吗?如果是这样,请更新问题并让我知道。只需添加或编辑其他字段中不存在的id。。。(在我的real DB 173=厄立特里亚仅出现在IDNATORIGN列中)您将看到,该id不会出现在结果中,除非它已插入三国柱中…几乎在那里!谢谢唯一的问题是,结果只涉及国家在各个领域的表现。几乎就在那里!谢谢问题是,查询实际上只列出了出现在每个字段中的国家:因此我无法看到,例如,出现在公民身份字段中的国家。。。我需要查看与这三个领域中任何一个领域相关的所有国家…@Take小姐,你有这种情况的样本数据吗?如果是这样,请更新问题并让我知道。只需添加或编辑其他字段中不存在的id。。。(在我的real DB 173=厄立特里亚仅出现在IDNATORIGN列中)您将看到此id不会出现在结果中,除非它已插入三国列中。。。