4 Stimmen

MySQL-basierte Webanwendung: Wie können die Benutzer am einfachsten eine Bestellung oder Artikel auswählen?

Ich arbeite an einem Projekt, bei dem die Benutzer die Elemente neu anordnen können, und zu einem späteren Zeitpunkt müssen diese Elemente in der gewählten Reihenfolge angezeigt werden. Nehmen wir als einfaches Beispiel eine Liste von Elementen:

A, B, C, D, E, F, G.
Die MySQL-Tabelle würde etwas Einfaches sein: user_id, letter, sortnumber

Der Benutzer kann die Reihenfolge schrittweise ändern. Er könnte A nach D, G an den Anfang usw. verschieben. Darüber hinaus kann er Elemente hinzufügen und entfernen. So kann er z. B. C löschen oder X hinzufügen. In jedem dieser Schritte sende ich Daten an PHP, das sie verarbeitet und die Elemente in MySQL einstellt.

Meiner Meinung nach gibt es zwei Möglichkeiten, dies zu tun:

  1. Jedes Mal, wenn sie etwas hinzufügen/entfernen/umstellen etwas hinzufügen, senden Sie die gesamte Liste an PHP, löschen alle Daten, die sie Daten, die sie vorher dort hatten, und nur die neue Liste einfügen. Das Problem ist, das ist eine Menge Löschungen/Einfügungen jedes Mal, wenn sie etwas tun. Sie könnten A nach B verschieben, und plötzlich lösche ich 7 Datensätze und füge 7 weitere ein. Das Gute daran ist, dass es ganz einfach ist.

  2. Bei jeder "Verschiebung" (z. B. Hinzufügen, Entfernen oder Nachbestellen) senden Sie die entsprechenden Informationen. Wenn z. B. An nach F verschoben wurde und mir gesagt wird: "Verschiebe An nach F", muss ich prüfen, ob sowohl A als auch F in der Liste vorhanden sind, dann muss ich alle "Sortiernummern" zwischen A und F (einschließlich F) abnehmen. Wenn sie "Z löschen" sagen, muss ich es in der Liste finden, löschen und alle Sortiernummern der nachfolgenden Datensätze dekrementieren.

Also bin ich einfach neugierig... Hatte jemand mit etwas zu tun, bei dem Ordnung wichtig ist, und wenn ja, wie sind Sie dabei vorgegangen?

2voto

Kristen Punkte 4123

Fügen Sie der Tabelle eine Spalte "Sequence" als Gleitkommazahl hinzu.

Wenn ein Element zwischen Zeile A und Zeile B verschoben wird, setzen Sie seine Sequenznummer auf den Durchschnitt der beiden benachbarten Spalten.

Indizieren Sie die Spalte Sequenz :)

0voto

ryeguy Punkte 62987

Wenn der Benutzer die neue Reihenfolge der Artikel speichern möchte, soll er die neue Reihenfolge mit der alten Reihenfolge vergleichen und nur diejenigen aktualisieren, die ihre Sortiernummer geändert. Wenn sie ein Element löschen, müssen Sie die Position nicht verschieben. Sortiernummer s nach unten. Wenn Sie eine Liste mit einer fehlenden Zahl in der Mitte sortieren, wird sie trotzdem in der richtigen Reihenfolge sein.

0voto

pd. Punkte 1205

Die endgültige Reihenfolge ist die einzige, die zählt. Wenn Sie sechs Elemente verschieben, um eine bestimmte Reihenfolge zu erhalten, brauchen Sie sich nicht wirklich darum zu kümmern, wie die Reihenfolge der Liste an den Punkten zwischen dem Beginn und dem Ende aussieht.

Fügen Sie Elemente hinzu und entfernen Sie sie, ohne sich um die Reihenfolge zu kümmern, und aktualisieren Sie dann die Elemente, um den Reihenfolgewert festzulegen, wenn Sie auf die Schaltfläche "Sortierung speichern" klicken.

Dies bietet Ihnen zwei Vorteile:

  • Das bedeutet weniger Aufwand bei jeder Änderung eines Artikels und damit auch mehr Geschwindigkeit.
  • Es ist ganz einfach, die Reihenfolge festzulegen - Sie müssen nur eine Liste der Element-IDs in der gewünschten Reihenfolge senden und dann darüber iterieren, wobei der Sequenzwert beginnend bei 0 und aufsteigend aktualisiert wird.

0voto

vishvananda Punkte 459

Sie haben einen Primärschlüssel und eine Sortiernummer für jedes Element. Wenn Sie ein php-Array haben, das die Primärschlüssel enthält, können Sie mit array_splice() Elemente entfernen und Elemente in das Array einfügen.

// base array
$items = array( 7, 11, 9, 4, 5);
// remove item 11
array_splice($items, array_search(11), 1);
// insert 11 before item 4
array_splice($items, array_search(4), 0, 11);
// input now contains 7, 9, 11, 4, 5

Dann eine Schleife durch das Array ziehen und die Sortierung mit den Primärschlüsseln aktualisieren

$i = 0;
foreach($items as $item) {
  // UPDATE item_table SET sorting = '$i' WHERE id = '$item';
  i++;
}

0voto

Andy Punkte 10195

Hier ist die gleiche Antwort, die ich auf die Frage von Thomaschaaf gegeben habe:

Dies ist kein einfaches Problem. Wenn Sie eine geringe Anzahl von sortierbaren Elemente haben, würde ich einfach alle von auf ihre neue Reihenfolge zurücksetzen.

Ansonsten scheint es so zu sein genauso viel Arbeit um nur die Datensätze zu ändern, die sich geändert haben.

Sie könnten diese Arbeit an die Klientenseite delegieren. Lassen Sie den Client die alte-sort-order und neue-sort-order und bestimmen, welche row[sort-order]'s aktualisiert werden sollen - und übergibt dann diese Tupel an die PHP-mySQL-Schnittstelle.

Sie können diese Methode in der folgendermaßen erweitern ( nicht r Floats):

  1. Wenn alle sortierbaren Elemente entsprechend ihrer Position in der Liste initialisiert werden, setzen Sie die Sortierreihenfolge eines jeden Element auf etwas wie Zeile[sort-order] = Zeile[sort-order * K] wobei K eine Zahl > Durchschnitt ist Anzahl der zu erwartenden Umordnungen der Liste neu geordnet wird. O(N), N=Anzahl der Elemente, erhöht aber die Einfüge Kapazität um mindestens N*K mit mindestens K offenen Slots von Elementen.

  2. Wenn Sie dann ein Element zwischen zwei anderen einfügen wollen, ist es so einfach die Sortierreihenfolge zu ändern zu ändern, die > das untere Element und < das obere. [ ] zwischen den Elementen, können Sie einfach den "Spread"-Algorithmus erneut anwenden (1) anwenden, der im vorigen Abschnitt vorgestellt wurde. Je größer K ist, desto seltener kommt es vor, dass desto seltener wird er angewandt.

Der K-Algorithmus würde b im PHP-Skript angewendet, während die Auswahl der neuen Sortierreihenfolgen durch den Client erfolgt (Javascript, vielleicht).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X