使用数据库中的数据创建网络图的数据集

时间:2016-07-20 14:02:20

标签: php mysql d3.js

我从我的数据库中获取数据并循环遍历它,并将一家公司的员工与其他公司的员工进行比较,以创建一系列节点和数据库。公司和公司的节点是为两家公司工作的员工。

比较这么多变量似乎会使这个过程变得很慢并且效率非常低,所以我正在寻找一种更好的方法来实现所述的array / json对象。

以下是数据库的外观http://imgur.com/8iVJfwW

d3的最终json对象应如下所示:

{"nodes":[{"fullName":"Anglo American plc"},{"fullName":"Associated British Foods plc"},{"fullName":"ARM Holdings plc"},{"fullName":"Dixons Carphone plc"},{"fullName":"Diageo plc"},{"fullName":"Direct Line Insurance Group PLC"},{"fullName":"easyJet plc"},{"fullName":"GKN plc"},{"fullName":"Hammerson plc"},{"fullName":"International Consolidated Airlines Group, S.A."},{"fullName":"Imperial Brands PLC"},{"fullName":"intu properties plc"},{"fullName":"Intertek Group plc"},{"fullName":"ITV plc"},{"fullName":"Johnson Matthey Plc"},{"fullName":"Kingfisher plc"},{"fullName":"Lloyds Banking Group plc"},{"fullName":"Mediclinic International plc"},{"fullName":"Merlin Entertainments plc"},{"fullName":"National Grid plc"},{"fullName":"Next Plc"},{"fullName":"Provident Financial plc"},{"fullName":"Pearson plc"},{"fullName":"Reckitt Benckiser Group plc"},{"fullName":"Royal Dutch Shell plc"},{"fullName":"RELX PLC"},{"fullName":"Rio Tinto plc"},{"fullName":"RSA Insurance Group plc"},{"fullName":"SABMiller plc"},{"fullName":"J Sainsbury plc"},{"fullName":"Sky plc"},{"fullName":"Standard Life plc"},{"fullName":"SSE plc"},{"fullName":"Severn Trent Plc"},{"fullName":"Travis Perkins plc"},{"fullName":"Tesco PLC"},{"fullName":"Taylor Wimpey plc"},{"fullName":"United Utilities Group PLC"},{"fullName":"Worldpay Group plc"},{"fullName":"Whitbread PLC"}],"edges":[{"source":0,"target":12,"officers":["PARKER, Thomas, Sir"]},{"source":0,"target":19,"officers":["STEVENS, Anne"]},{"source":0,"target":47,"officers":["GROTE, Byron"]},{"source":1,"target":14,"officers":["BASON, John"]},{"source":2,"target":13,"officers":["PUSEY, Stephen"]},{"source":2,"target":51,"officers":["KENNEDY, Christopher"]},{"source":3,"target":7,"officers":["BARKER, Glyn"]},{"source":3,"target":13,"officers":["WHEWAY, Jonathan"]},{"source":4,"target":9,"officers":["REYNOLDS, Paula"]}]};

我正在做的是执行此查询:

SELECT 
    CD.Company_ID,
    CD.Company_Name,
    OD.Officer_Name,
    CO.Officer_Role
FROM
    Company_Details CD
INNER JOIN Company_Officer CO 
   ON CD.Company_ID = CO.Company_ID
INNER JOIN Officer_Details OD 
   ON CO.Officer_ID = OD.Officer_ID
WHERE CD.Company_Index='FTSE 100' AND 
      CO.Resigned_On='' AND
      CO.Officer_ID IN
       ( SELECT CO2.officer_id
         FROM   Company_Officer CO2
         INNER JOIN Company_Details CD2
         ON CO2.Company_ID = CD2.Company_ID
         WHERE CO2.Resigned_On='' AND CD2.Company_Index ='FTSE 100'
         GROUP  BY CO2.officer_id
         HAVING Count( DISTINCT CO2.company_id ) > 1 
       )
ORDER BY `CD`.`Company_ID` ASC;

这给了我官员和公司的名字,只有为超过1家公司工作的人员(创造优势)和只有未辞职的官员。

首先,我通过循环查询并获得唯一的公司来创建$nodes

while($row = mysqli_fetch_array($data)){
    array_push($Officers_DB,array("name"=>$row['Officer_Name'], "company"=>$row['Company_Name'])); 
    if(!valueExists($nodes, 'fullName', $row['Company_Name'])){ //Get rid of duplicates
        array_push($nodes, array("fullName"=>$row['Company_Name']));
    }
}

然后我通过将每个公司与我的$edges阵列中的每个公司进行比较来创建$nodes,然后我检查我是否在比较相同的公司之后我从查询中循环所有人员并比较它们与所有其他官员再次查询我检查这是不是同一个官员,然后我检查第一个循环的官员是否适用于$i公司,并且在下一个循环中,如果官员为“$ j”公司工作,那么如果有一个同名的人为我在$edges创建优势的两家公司工作。

$edges = array();
for ($i = 0; $i < count($nodes); $i++) {
    for ($j = $i + 1; $j < count($nodes); $j++) {
        if ($nodes[$i]['fullName'] != $nodes[$j]['fullName']) {
            foreach($Officers_DB as $Officer){
                if($Officer['company']==$nodes[$i]['fullName']){
                    foreach($Officers_DB as $Officer2){
                        if($Officer2['company']==$nodes[$j]['fullName']){
                            if($Officer['name']==$Officer2['name']){
                                array_push($edges, array("source"=>$i, "target"=>$j, "officers"=>array($Officer['name'])));
                            }
                        }
                    }
                }
            }
        }
    }
}

foreach ($edges as $i => &$edge) {
    for ($j = $i + 1; $j < count($edges); $j++) {
        if ($edge['source'] == $edges[$j]['source'] && $edge['target'] == $edges[$j]['target']) {
            foreach ($edges[$j]['officers'] as $officer) {
                array_push($edge['officers'], $officer);
            }
            array_splice($edges, $j, 1);
        }
    }
}

这种方法有效,但效果很慢且效率低下,我想知道其他方法可以达到相同的结果。

以下是数据库如何看起来像Company_details:http://i.imgur.com/bzDBIPI.png公司是唯一的

Officer_details:http://i.imgur.com/xce9DW5.png官员是独一无二的

和Company_Officer:http://i.imgur.com/SNYOx0i.png这是其他两个之间的关系表。关系一对多,多对一。

0 个答案:

没有答案