Php 有条件地将查询中的元素插入另一个数据库表

Php 有条件地将查询中的元素插入另一个数据库表,php,mysql,Php,Mysql,我正在查询生成所需结果的两个表。我需要有条件地将这个结果数组中的元素插入到另一个表中。请原谅我缺乏理解,但我对php和mysql还相当陌生 结果字段为:总线id、年龄、种族和性别。我想有条件地将这些字段的元素插入到另一个包含以下字段的表中:bus\u id,no\u people,male,meetics% 结果数组中的总线id不=插入表中的总线id 例如,我想计算分配给特定公交id的人数,并确定人数、男性、女性和种族百分比 我的思维过程可能看起来很复杂,但请原谅我是个新手。如果你能给我指出正确

我正在查询生成所需结果的两个表。我需要有条件地将这个结果数组中的元素插入到另一个表中。请原谅我缺乏理解,但我对php和mysql还相当陌生

结果字段为:
总线id、年龄、种族和性别
。我想有条件地将这些字段的元素插入到另一个包含以下字段的表中:
bus\u id,no\u people,male,meetics%

结果数组中的
总线id
不=插入表中的
总线id

例如,我想计算分配给特定
公交id
的人数,并确定人数、男性、女性和种族百分比

我的思维过程可能看起来很复杂,但请原谅我是个新手。如果你能给我指出正确的方向,我将不胜感激

好的,这是我查询的前两个表的结果表: bus_name bus_id cus_name age race sex DHL 10 tom selleck 32 asian male Fedex 17 jennifer lopez 34 black female UPS 1 jet li 26 black male UPS 1 hugh douglas 40 black male UPS 1 ray lewis 40 white male UPS 1 michael vick 38 black male UPS 1 ed reed 44 white male UPS 1 joe flacco 17 white male UPS 1 bob dole 26 latin male UPS 1 deion sanders 15 white male UPS 1 bill clinton 15 latin male UPS 1 lebron james 41 white male

巴士名称巴士id客户姓名年龄种族性别 DHL 10 tom selleck 32亚洲男性 联邦快递17詹妮弗·洛佩兹34黑人女性 UPS 1李连杰26黑人男性 UPS 1 hugh douglas 40黑人男性 UPS 1 ray lewis 40白人男性 UPS 1 michael vick 38黑人男性 UPS 1 ed reed 44白人男性 UPS 1 joe flacco 17白人男性 UPS 1 bob dole 26拉丁男性 UPS 1 deion sanders 15白人男性 UPS 1比尔·克林顿15拉丁男性 UPS 1勒布朗·詹姆斯41白色男性

我想有条件地将这些元素插入另一个名为“comp_struct”的表中,该表有以下字段:总线id、男性、女性、种族%(可能会将其更改为多样性百分比)暂时忘记种族%

所以我希望它看起来像这样一旦完成

bus_id no_people males females 1 10 10 0 17 1 0 1 10 1 1 0 巴士识别号没有人男女 1 10 10 0 17 1 0 1 10 1 1 0 这就是我用代码生成第一个表结果的程度

$query1 = $db->query("SELECT bus.bus_name, bus.bus_id, bus_users.purch, bus_users.cus_name, bus_users.age, bus_users.race, bus_users.sex FROM bus, bus_users WHERE bus_users.purch = bus.bus_id ORDER BY bus.bus_name") or die($db->error); while($result = mysqli_fetch_assoc($query1)) { ( "SELECT bus_id, COUNT(*), SUM(IF(sex='male', 1, 0)) AS males, SUM(IF(sex='female', 1, 0)) AS females FROM @query1 GROUP BY bus_id INSERT INTO comp_struct (bus_id, no_people, males, females) SELECT bus_id, COUNT(*) AS no_people, SUM(IF(sex='male', 1, 0)) AS males, SUM(IF(sex='female', 1, 0)) AS females FROM @query1 GROUP BY bus_id"); $query1=$db->query(“选择bus.bus\u名称、bus.bus\u id、bus\u用户.purch、bus\u用户.cus\u名称、bus\u用户.age、bus\u用户.race、bus\u用户.sex FROM bus、bus\u用户,其中bus\u用户.purch=bus.bus\u id按bus.bus\u名称排序”)或die($db->->错误); 而($result=mysqli\u fetch\u assoc($query1)) { (“选择总线id, 计数(*), 总和(如果(sex='male',1,0))为男性, 作为女性的总和(如果(性别=女性),1,0) 来自@query1 按总线id分组 插入组件结构(总线id、无人员、男性、女性) 选择总线id, 将(*)算作“无”人, 总和(如果(sex='male',1,0))为男性, 作为女性的总和(如果(性别=女性),1,0) 来自@query1 按总线分组(“id”);
不用说,这不会产生期望的结果。

暂时忽略种族字段,您可以通过以下方式获得所需的值:-

SELECT bus_id, 
        COUNT(*), 
        SUM(IF(sex='male', 1, 0)) AS males,
        SUM(IF(sex='female', 1, 0)) AS females
FROM table_one
GROUP BY bus_id
并插入以下内容:-

INSERT INTO table_two(bus_id, no_people, males, females)
SELECT bus_id, 
        COUNT(*) AS no_people, 
        SUM(IF(sex='male', 1, 0)) AS males,
        SUM(IF(sex='female', 1, 0)) AS females
FROM table_one
GROUP BY bus_id
编辑-根据您现在提供的详细信息,一条语句将按如下方式执行插入操作(无需先单独选择行)

编辑-这也可以让您了解种族:-

SELECT bus_id, no_people, males, females, GROUP_CONCAT(CONCAT(race, race_percentage, '%'))
FROM
(
    SELECT Sub1.bus_id, Sub2.no_people, Sub2.males, Sub2.females, Sub1.race, (Sub1.race_count / Sub2.no_people) * 100 AS race_percentage
    FROM
    (
        SELECT bus.bus_id , 
                bus_users.race, 
                COUNT(*) AS race_count
        FROM bus
        INNER JOIN bus_users 
        ON bus_users.purch = bus.bus_id 
        GROUP BY bus.bus_id, race
    ) Sub1
    INNER JOIN
    (
        SELECT bus.bus_id , 
                COUNT(*) AS no_people, 
                SUM(IF(bus_users.sex ='male', 1, 0)) AS males,
                SUM(IF(bus_users.sex ='female', 1, 0)) AS females
        FROM bus
        INNER JOIN bus_users 
        ON bus_users.purch = bus.bus_id 
        GROUP BY bus.bus_id
    ) Sub2
    ON Sub1.bus_id = Sub2.bus_id
) Sub0
GROUP BY bus_id
SQL fiddle在这里提供:-


有一个计数()函数,它可以帮助您。您只需要在WHERE子句中指定正确的条件。或者您也可以在PHP中对它们进行计数。您需要编写一些代码,然后告诉我们它在哪里不起作用。我知道我必须使用count函数,但如何计算只分配给特定对象的结果元素“bus_id”,然后将该答案插入另一个表中。您可以使用SUM(IF(somefield='female',1,0))等语法而不是计数。但是,您可以添加表格定义、样本数据和样本结果吗?您如何计算种族百分比?或者总线id是否与种族相关?更新以与额外的表格详细信息一起使用W,这太神奇了!
SELECT bus_id, no_people, males, females, GROUP_CONCAT(CONCAT(race, race_percentage, '%'))
FROM
(
    SELECT Sub1.bus_id, Sub2.no_people, Sub2.males, Sub2.females, Sub1.race, (Sub1.race_count / Sub2.no_people) * 100 AS race_percentage
    FROM
    (
        SELECT bus.bus_id , 
                bus_users.race, 
                COUNT(*) AS race_count
        FROM bus
        INNER JOIN bus_users 
        ON bus_users.purch = bus.bus_id 
        GROUP BY bus.bus_id, race
    ) Sub1
    INNER JOIN
    (
        SELECT bus.bus_id , 
                COUNT(*) AS no_people, 
                SUM(IF(bus_users.sex ='male', 1, 0)) AS males,
                SUM(IF(bus_users.sex ='female', 1, 0)) AS females
        FROM bus
        INNER JOIN bus_users 
        ON bus_users.purch = bus.bus_id 
        GROUP BY bus.bus_id
    ) Sub2
    ON Sub1.bus_id = Sub2.bus_id
) Sub0
GROUP BY bus_id