Kategorien umstellen auf "freie" Sortierung

splat

Erfahrenes Mitglied
Hallo nochmal :)

Ich stelle gerade meine Datenbank auf eine "freie" Sortierung um.
Bisher sieht das ganze so aus:

Code:
--------------------------------
id | parent_id | name
--------------------------------
1  | 0         | kat_a
2  | 1         | kat_b
3  | 2         | kat_c
4  | 0         | kat_d
5  | 1         | kat_e
6  | 4         | kat_f
....
--------------------------------

Es soll eine neue Spalte "sortierung" mit einem integer Wert entstehen, mit dem man später die Kategorien hoch- bzw runtersetzen kann.
Das ganze später zu realisieren, werde ich wohl noch hinbekommen :)
Aber wie schaffe ich es, im Vorfeld meinen Kategorien schon die richtige Position zu vergeben? Ich könnte das zwar auch per Hand anstellen, aber bei 700 Kategorien ist mir ein kleines Skript doch lieber :)

Zur Zeit sind die Kategorien dem Namen nach sortiert, und es wäre schön wenn ich in der selben Reihenfolge die Positionen vergeben lassen kann.

Das würde dann so aussehen:

Code:
---------------------------------
id | parent_id | name  | position
---------------------------------
1  | 0         | kat_a | 1
2  | 1         | kat_b | 1
3  | 2         | kat_c | 1
4  | 0         | kat_d | 2
5  | 1         | kat_e | 2
6  | 4         | kat_f | 1
....
---------------------------------

Oder ist so etwas vielleicht auch mit direktem SQL Befehl machbar? Dafür reicht mein Wissen jedoch leider nicht ganz aus.. :/
Mit einem Skript muss das doch aber sicherlich irgendwie gehen, oder?

Gruß,
Marc
 
Naja... hole die Datensätze erstmal nach folgender Sortierung aus der DB:
parent_id, name

danach gehst du alle durch.
jedes mal, wenn sich parent_id ändert, startest du einen Zähler bei 1, und fügst den Wert dieses Zählers bei position ein.
 
Hi Sven

Sven Mintel hat gesagt.:
danach gehst du alle durch.
jedes mal, wenn sich parent_id ändert, startest du einen Zähler bei 1, und fügst den Wert dieses Zählers bei position ein.

hmm.. eigentlich ist das ja nichts großes. Die Reihenfolge stimmt ja jetzt schon mal.
Aber wie kann ich den Zähler in der Schleife jetzt immer um eins erhöhen, sobald sich die parent_id ändert? Stehe gerade etwas auf dem Schlauch. :rolleyes:

Marc
 
Speichere die letzte ID einfach in einer temporären Variable und vergleiche den Wert mit der aktuellen ID, etwa:
PHP:
$tmp = null; $i = 0;
while( $row = mysql_fetch_assoc($result) ) {
	if( $tmp != $row['parent_id'] ) {
		$i++;
	}
	$tmp = $row['parent_id'];
	…
}
 
Super! :) Danke für eure Hilfe!

Habe mich im letzten Beitrag vertan..
Der Zähler sollte logischerweise nicht erhöht, sondern wieder zurückgesetzt werden, sobald sich die parent_id ändert.
Das Update hat für meinen Fall jetzt so funktioniert:

PHP:
$tmp = null; $i = 1;
while( $row = mysql_fetch_assoc($sql) ) {   
    $i++;
    if( $tmp != $row['parent_id'] ) {
        $i = 1;
    }
    $tmp = $row['parent_id'];
    db_query("UPDATE categories	SET position = $i WHERE id = $row[id]");
}

Gruß,
Marc
 
Zurück