2016-10-01 3 views
7

API die Kategorien wie so zurückgibt:Nesting Kategorien für 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 
      ) 

Und ich brauche sie in der DB einzufügen wie so:

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

..., die einfach, aber die category_to_path Tisch ist knifflig, was ich nicht herausfinden kann. Es muss so sein:

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

Dies ist, was ich bisher:

$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

Im Allgemeinen erfordert dies möglicherweise eine rekursive Abfrage, um alle Pfade zu finden. –

+0

Wissen Sie, wie viele Ebenen tief der tiefste Pfad in der Tabelle ist? –

+0

@TimBiegeleisen 3 max – 3zzy

Antwort

0

Die folgende Abfrage sollten Sie die Kategorien und Wege geben. Die Ebenen werden nicht angegeben, da Ihre Originaldaten keine Zeilennummer enthalten. Möglicherweise müssen Sie dynamisches SQL verwenden, wenn Sie die Ebenen abrufen möchten.

Die Strategie, die ich verwendet, ist zu überqueren die Kategorien zu verbinden, das alle möglichen Start- und Endpunkte erzeugt. Es erzeugt auch einige Pfade, die von der Tabelle nicht unterstützt werden. Um diese unerwünschten Pfade zu entfernen, überprüfe ich jeden Pfad gegen eine Unterabfrage, um sicherzustellen, dass er erstellt werden kann, indem er in 3 Schritten oder weniger von Kategorie zu Pfad verschoben wird.

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

Der PHP-Code in der Beschreibung ist das, was ich von der API bekommen, die ich dann in einem Array speichern, um DB auf einmal zu schreiben, aber ich habe nicht in der Lage gewesen programmatisch noch die Zeilen eingefügt werden, das ist das Problem. – 3zzy

+0

Also sagen Sie, Sie haben bereits die Tabelle 'category_to_path' generiert? –

+0

Ja, es ist die OpenCart E-Commerce-Software. http://stackoverflow.com/questions/15162193/opencart-how-to-accurately-populate-oc-category-path so die Tabellen existieren, ich brauche nur – 3zzy

0

Ich würde versuchen, Array neu zu schreiben, nachdem es von der API zu erhalten, so kann es aussehen:

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

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

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

Wenn Sie Ihren Array aus der API erhalten Sie es mit einfacher foreach-Schleife verarbeiten können.

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

Jetzt können Sie einfach auf Eltern zugreifen, so dass es nicht schwer sein sollte zu erreichen, was Sie brauchen.

+0

Das Umschreiben der API ist keine Option. – 3zzy

+0

Ich meine nicht, API neu zu schreiben - Sie können Array neu schreiben, nachdem Sie es von der API erhalten haben. –