Denkansatz für Sortierung benötigt

WACSF

Erfahrenes Mitglied
Guten Tag.

Ich habe ein kleines Problem mit meiner eigenen Sortierung.
Zur Erklärung: Ich habe eine Tabelle mit Kategorien, welche folgende Werte beinhaltet.
ID
KAT_NAME

Ich habe auch eine Abfrage, die die Werte einer anderen Tabelle mit dem KAT_NAME abgleicht und dann unter der Kategorie die verschiedenen Links auflistet.
So nun dachte ich mit, dass ich die Reihenfolge der Kategorien selber verändern möchte.
Ich habe folgende Überlegungen angestellt. Ich muss die ID Werte einfach nur vertauschen, je nachdem, ob ich nach oben oder nach unten verschieben will.

Nun das ist eigentlich auch nicht so der Act. Nur was ist los, wenn in dem ID Feld folgendes stehen würde. 1 3 9 12 18 19 usw. Das kann ja passsieren, wenn ich etwas aus der Tabelle rauslösche. dann werden die Werte ja nicht um 1 runtergesetzt, sondern bleiben so. Und Hier bräuchte ich eure Hilfe. Ich dachte mir, dass ich die ID Werte irgendwie in ein array auslese und damit dann die Werte richtig bestimmen kann um sie zu vertauschen.

Das ist das Grundgerüst bis jetzt:
PHP:
<?php
   include ("dbconnect.php");
   $b=mysql_query("SELECT * FROM wtv_link_kat WHERE KATID = '$katid'");
   $a=mysql_fetch_array($b); 
   
   mysql_query("UPDATE wtv_link_kat SET KATID = KATID + 100 WHERE KATID = $a[KATID] + 1");
   mysql_query("UPDATE wtv_link_kat SET KATID = KATID + 1 WHERE KATID = '$katid'");
   mysql_query("UPDATE wtv_link_kat SET KATID = KATID - 101 WHERE KATID = $a[KATID] + 101");
   echo "Kategorien wurden vertauscht";
   
 ?>

Ich würde mich sehr über eure Hilfe freuen,

WACSF
 
Hallo WACSF,

schönes Problem :o)

ja, da zeigen sich wiedermal die Nachteile von Autowerten in Datenbanken. Also generell ist es kein Problem Datensätze zu löschen, Reihenfolge bleibt erhalten und gut ist.
An deiner Stelle würd ich auch nicht versuchen an diesem ID Feld "rumzuwurschteln" bringt nicht so wirklich viel. Mach lieber ne Zweite Spalte in der du deine Reihenfolge hast, die Spalten kannste ändern wie du willst und auch die Werte darin, dann interessiert dich die ID auch nimmer. Damit du deine andere Tabelle für den Abgleich auch noch nutzen kannst nimmst dann einfach als "Vergleichsobjekt" die Reihenfolgenspalte und fertsch.

Brauchste nur noch nen Script zur Anzeige deiner Reihenfolge und in dem du die dann auch gleich ändern kannst, dann brauchst nichmal mehr direkt in die Datenbank.

Hab da glaube ich noch was rumfliegen wenn du dazu noch was brauchst.

Vieleicht hilft dir der Lösungsversuch ja
 
Hallo und erstmal Herzlichen Dank für die Hilfe.

Also sollte ich eine neue Spalte machen, in der dann auch normale Zahlen stehen, aber nicht durch auto_increment erstellt werden, sondern manuell? Ich hoffe dass ich das richtig verstanden habe. So nun habe ich damit ein Problem. Wie setzt ich den Wert dieser zusätzlichen Zeile bei jedem Eintrag um eins nach oben und was geschieht mit den Einträgen, die ich ggf. lösche, weil dann ist ja wieder eine Lücke im System drin und dann geht wieder o.g. Script nicht. Ich denke, wenn ich es irgendwie schaffen könnte die ID oder eben die neue Spalte so auszulesen, dass der Wert vor und nach der $katid ermittelt wird, dann könnte ich es schaffe, dass auch solche "Reihen" erfolgreich verändert werden könnten: 1-5-23. Dadurch könnte ich einfach die oberer bzw. die untere zahl auf eine Stufe höher bzw. tiefer setzten. So hatte ich mir das gedacht, aber wie kann ich meine Spalte (SQL Tabelle) so abfragen, damit ich nur diese drei Werte bekomme. Oder wie muesste eine Funktion aussehen, damit ich aus alles Einträgen genau die eine weiter unten und einer weiter oben liegende Zahl von der $katid herausbekomme.

Herzlichen Dank nochmal,

WACSF
 
Beim Eintragen einfach die aktuell höchste Ordnung auslesen, und dem neuen Datensatz Ordnung + 1 geben. Beim löschen einfach alle Ordnungen, die höher als die gelöschte sind, um eins nach unten setzen.
 
Hallo,

wollt ich gerade sagen Oliver :o)

also gibt ja nur 3 Möglichkeiten: Hinzufügen, Rangordnung ändern, Löschen

Hinzufügen:
da kriegst ja automatisch die höchste ID die möglich ist, und nimmst die höchste Rangordnung die Frei ist (einfach auslesen)

Rangordnung ändern:
einfach Rangordnung auslesen, dann je nachdem ob du hoch oder runter möchtest die Datensatzmenge auslesen die über bzw unter deinem Datensatz liegt und bei dieser Datensatzmenge einfach mit ner While-Schleife das Rangordnungsfeld um 1 erhöhen oder um 1 erniedrigen. fertig.

Löschen:
einfach Rangordnung auslesen, dann die Datensatzmenge auslesen die eine höhere Rangordnung hat und bei dieser Datensatzmenge, wieder mit einer While-Schleife, die Rangordnung um 1 erniedrigen.

Du siehst, die ID ist dabei völlig egal :o)
 
Hi und Danke für die Hilfe,

nur wie setze ich das um. ich weiß nicht, wie ich das auslesen kann.

Wäre für eine kleine Hilfe nochmals sehr dankbar
 
hmmmm, Oliver ist schon leicht genervt :o)

wobei ich auch nicht so recht verstehe wo nun das Problem liegt *seuftz*
Du hast doch oben schon eine mySQL Abfrage drin, also denk ich mal du hast ein bissel Ahnung von SQL an sich.
Da kanns doch nicht so schwer sein

Will ja auch nicht unfähr sein, aber ab und an vereinfacht nachlesen das Leben ungemein :o\

hm, naja was solls.

Anzahl der Datensätze:

1.
$abfrage = mysql_query("Select rang_id from deine Tabelle");
$Anzahl = mysql_num_rows($abfrage);
$neue_rang_id = $Anzahl +1;

2.
$abfrage = mysql_query("Select rang_id from deine Tabelle where rang_id > bzw. < als die die du verschieben möchtest");
while ($blabla=mysql_fretch_rows($abfrage)){
Befehl
Befehl
......
}

3.
$abfrage = mysql_query("Select rang_id from deine Tabelle where rang_id > als die die du löschen möchtest");
while ($blabla=mysql_fetch_rows($abfrage)){
Befehl
Befehl
...
}
mysql_query("delete from Tabelle where rang_id = zu löschende rang_id);


Hoffe das reicht nun als Denkansatz sonst kann ich dir das ja auch gleich selber schreiben :o)

achja, wegen dem nachlesen, hier wäre dann mal was:
PHP4 Openbook
 
Zuletzt bearbeitet:
Zurück