2017-06-22 87 views
0

我正在查詢到DBMYSQL一個一對多的關係推到數組

$query="SELECT com.id, com.name, ctx.LastName, ctx.FirstName, com.company_phone,addr.City, addr.Street "; 
    $query.="FROM Connections as con "; 
    $query.="LEFT JOIN Companies as com on con.company_id = com.id "; 
    $query.="LEFT JOIN Contacts as ctx on con.contact_id = ctx.id "; 
    $query.="LEFT JOIN addresses as addr on addr.id = com.Legal_address "; 
    if($value['db']=='companies') $query.="WHERE LOWER(com.".$value['model'].") RLIKE LOWER('".$value['val']."')"; 
    else if($value['db']=='contacts') $query.="WHERE LOWER(ctx.FirstName) RLIKE LOWER('".$value['val']."') OR LOWER(ctx.LastName) RLIKE LOWER('".$value['val']."')"; 
    else if($value['db']=='addresses') $query.="WHERE LOWER(addr.City) RLIKE LOWER('".$value['val']."') OR LOWER(addr.Street) RLIKE LOWER('".$value['val']."')"; 

,然後將結果發送回客戶端。因此,我可以看到,例如:

[ 
{ 
    id:1, 
    name: google, 
    contact: Smith, 
    .... 
}, 
{ 
    id:1, 
    name: google, 
    contact: Black, 
    .... 
}, 
{ 
    id:2, 
    name: microsoft, 
    contact: Walker, 
    .... 
} 
.... 

但我想看看沒有重複的行,但陣列,其中有一個一對多的關係。如第二個例子:

[ 
{ 
    id:1, 
    name: google, 
    contact: [Smith, Black], 
    .... 
}, 

{ 
    id:2, 
    name: microsoft, 
    contact: Walker, 
    .... 
} 
.... 

我的SQL知識非常糟糕。我已經被告知WHERE + JOIN不爽。所以有可能改變我的查詢,以便它會像第二個例子。

P.S.我向客戶端發送響應時使用json格式的結構編寫的兩個數組。

+1

此鏈接可能會幫助你 - [MySQL Group_Concat](https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat) –

+1

在你的查詢中你需要在末尾添加'group by com.id'並在選擇部分添加'group_concat(ctx.LastName)'(假定contact是你的姓氏列) –

+0

我已經把這個回答了,你可以查看[這裏] (https://stackoverflow.com/a/44698338/2679536) –

回答

1
$query="SELECT com.id, com.name, CONCAT('[',GROUP_CONCAT(ctx.LastName),']') AS contact, ctx.LastName, ctx.FirstName, com.company_phone,addr.City, addr.Street "; 
$query.="FROM Connections as con "; 
$query.="LEFT JOIN Companies as com on con.company_id = com.id "; 
$query.="LEFT JOIN Contacts as ctx on con.contact_id = ctx.id "; 
$query.="LEFT JOIN addresses as addr on addr.id = com.Legal_address "; 
if($value['db']=='companies') $query.="WHERE LOWER(com.".$value['model'].") RLIKE LOWER('".$value['val']."')"; 
else if($value['db']=='contacts') $query.="WHERE LOWER(ctx.FirstName) RLIKE LOWER('".$value['val']."') OR LOWER(ctx.LastName) RLIKE LOWER('".$value['val']."')"; 
else if($value['db']=='addresses') $query.="WHERE LOWER(addr.City) RLIKE LOWER('".$value['val']."') OR LOWER(addr.Street) RLIKE LOWER('".$value['val']."')"; 
$query .= " GROUP BY com.id "; 

我假設LastName列爲Contact從您的輸出JSON。

+0

但group_concat使{{:聯繫:「史密斯,白色」}而不是{聯繫:[史密斯,白色]}}的東西} – RoGGeR

+0

@RoGGeR,我已更新我的查詢通過使用'CONCAT'。希望你會得到預期的結果。 –

+0

這很奇怪,但它看起來仍然是一個字符串{CONCAT('[',GROUP_CONCAT(ctx.LastName),']'):「[xxx,kjhgfd]」} – RoGGeR

1

您可能將不得不採取數據並製作您想要的數組。

$data = array(); 
    foreach ($result as $fields) { 
     $key = $fiels['name']; // or $item['info_id'] 
     if (!isset($data[$key])) { 
      $data[$key] = array(); 
     } 

     $data[$key][] = $field; 
    } 

// Build your table with the new $data array 

這只是一個例子。正如它指出的那樣,如果你的名字字段不是唯一的,你將需要在一個唯一的鍵上構建你的數組。與此無異,因爲您可能只是將$field['name']的實例更改爲$field['info_id']