2016-10-01 92 views
7

API返回類似的類別這樣:嵌套類爲MySQL

[1] => Array 
     (
      [category_id] => 14308 
      [parent_id] => 14308 
      [level] => 0 
     ) 

    [2] => Array 
     (
      [category_id] => 179836 
      [parent_id] => 14308 
      [level] => 1 
     ) 

     [3] => Array 
      (
       [category_id] => 230022 
       [parent_id] => 179836 
       [level] => 2 
      ) 

,我需要將其插入數據庫,像這樣:

╔═════════════╦═══════════╗ 
║ category_id ║ parent_id ║ 
╠═════════════╬═══════════╣ 
║  14308 ║   0 ║ 
║  179836 ║  14308 ║ 
║  230022 ║ 179836 ║ 
╚═════════════╩═══════════╝ 

...這是很容易,但category_to_path表是棘手的,我似乎無法弄清楚。它必須是這樣的:

╔═════════════╦═════════╦═══════╗ 
║ category_id ║ path_id ║ level ║ 
╠═════════════╬═════════╬═══════╣ 
║  14308 ║ 14308 ║  0 ║ 
║  179836 ║ 14308 ║  0 ║ 
║  179836 ║ 179836 ║  1 ║ 
║  230022 ║ 14308 ║  0 ║ 
║  230022 ║ 179836 ║  1 ║ 
║  230022 ║ 230022 ║  2 ║ 
╚═════════════╩═════════╩═══════╝ 

這是我到目前爲止有:

$path_ids; 
for ($i=0; $i <= ($category->CategoryLevel-1); $i++) { 
// -1 cause the API returns a non zero-based level 

    $path_ids[$i]['category_id'] = $category->CategoryID; 

    if ($category->CategoryLevel-1 == $i) { 
    $path_ids[$i]['path_id'] = $category->CategoryParentID[0]; 
    } 
    elseif ($category->CategoryLevel-1) { 
    // ? 
    } 

    $path_ids[$i]['level'] = $i; 

} 
+2

通常這可能需要遞歸查詢來查找所有路徑。 –

+0

你知道桌子最深處有多深? –

+0

@TimBiegeleisen 3 max – 3zzy

回答

0

下面的查詢應該給你的類別和路徑。它沒有給出關卡,因爲你的原始數據沒有任何行號。如果您想獲取關卡,您可能需要使用一些動態SQL。

我使用的策略是交叉加入類別,它會生成所有可能的起點和終點。它還會生成一些不受表格支持的路徑。要刪除這些不需要的路徑,我檢查每個路徑與子查詢,以確保它可以通過從3個步驟或更少的步驟遍歷從類別到路徑創建。

SELECT t1.category_id AS category_id, 
     t2.category_id AS path_id 
FROM yourTable t1 
CROSS JOIN yourTable t2 
INNER JOIN 
(
    SELECT t1.category_id AS category_id_1, 
      t2.category_id AS category_id_2, 
      t3.category_id AS category_id_3 
    FROM yourTable t1 
    LEFT JOIN yourTable t2 
     ON t1.parent_id = t2.category_id 
    LEFT JOIN yourTable t3 
     ON t2.parent_id = t3.category_id 
) t2 
    ON t1.category_id = t2.category_id_1 AND 
     t2.category_id IN (t2.category_id_1, t2.category_id_2, t2.category_id_3) 
ORDER BY category_id, 
     path_id 
+0

描述中的PHP代碼是我從API中獲得的,然後我將它存儲在一個數組中,一次寫入數據庫,但是我還沒有能夠以編程方式插入行,這就是問題。 – 3zzy

+0

那麼你是說你已經有'category_to_path'表生成了嗎? –

+0

是的,它是OpenCart電子商務軟件。 http://stackoverflow.com/questions/15162193/opencart-how-to-accurately-populate-oc-category-path所以表存在,我只需要填充他們的數據從API – 3zzy

0

我會嘗試從API獲得它後修改數組,以便它可以看起來這樣:

[14308] => Array 
(
    [parent_id] => 14308 
    [level] => 0 
) 

[179836] => Array 
(
    [parent_id] => 14308 
    [level] => 1 
) 

[230022] => Array 
(
    [parent_id] => 179836 
    [level] => 2 
) 

當你從API數組您就可以用簡單的foreach循環處理它。

$arrayFromApi = apiCallToObtainData();  
$newArray = []; 
foreach($arrayFromApi as $value){ 
    $newArray[$value['category_id']] = [ 
     $value['parent_id'], 
     $value=['level'], 
    ]; 
} 

現在你可以很容易地訪問父母,所以它應該不難實現你所需要的。

+0

重寫API不是一個選項。 – 3zzy

+0

我不是說重寫API--你可以在從API獲取數組後重寫數組。 –