我从我的数据库中获取数据并循环遍历它,并将一家公司的员工与其他公司的员工进行比较,以创建一系列节点和数据库。公司和公司的节点是为两家公司工作的员工。
比较这么多变量似乎会使这个过程变得很慢并且效率非常低,所以我正在寻找一种更好的方法来实现所述的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这是其他两个之间的关系表。关系一对多,多对一。