Hallo,
ich pflege in einer Tabelle Daten die als ein Merkmal das Feld Typ besitzen.
Innerhalb dieser Tabelle gibt es vier unterschiedliche Typen.
Der User der die Daten eingibt, wählt den Typ (a, b, c oder d) und gibt den DS ein.
Gleichzeitig wird eine AutoId vergeben und eine Sortiernummer festgelegt.
Im Prinzip
id typ bez
2719 a Zeile 1
2718 a Zeile 2
2717 c Zeile 1
2716 a Zeile 4
2715 b Zeile 1
2714 d Zeile 1
2710 d Zeile 2
2711 a Zeile 8
2712 a Zeile 9
2713 a Zeile 10
Jetzt möchte ich die DS nachträglich innerhalb des types sortieren.
Was ich hinbekommen habe, ich kann immer einen DS nach oben oder einen DS nach unten.
Siehe den Link. Daten vom Typ a
http://guckstdu.bplaced.net/index.php
Weiß jemand wie ich es machen muss um zusätzlich den obersten DS gleich bis nach unten zu bekommen oder umgekehrt.
Danke
Guckst Du
Was genau willst du? die Daten Sortieren?
Das kannst du auch über das Feld “id” machen.
BEGIN
UPDATE TABLE tabelle SET id = id+1 WHERE id = $id;
UPDATE TABLE tabelle SET id = id-1 WHERE id = (SELECT $id - 1);
COMMIT
Damit werden die ID’s der Zeilen getauscht, und damit auch die Inhalte der Zeilen, damit ist das Löschen der ID’s aber nicht möglich, da ein Loch entstehen würde
BEGIN
SET @next_id = (SELECT id FROM tabelle WHERE id > $id LIMIT 1);
UPDATE TABLE tabelle SET id = @next_id WHERE id = $id;
UPDATE TABLE tabelle SET id = $id WHERE id = @next_id;
COMMIT
Hallo michi7x7,
im Moment sortiere ich die Daten jeweils um einen DS nach oben oder nach unten.
Über die Id kann ich nicht sortieren, da ich nach Typ ausgewählte DS sortieren möchte. Und die ID soll auch ein “unveränderlicher Wert” bleiben.
In meinem Beispiel sortiere ich nur DS vom TYP A. (den Typen wähle ich eine Seite vorher aus)
In meinem Beispiel gucke ich nach dem aktuellen DS (den, welchen ich verschieben will) und den DS davor oder danach.
Dann tausche ich die Sortierungsnummern.
Hier ist der PHP Code
[code]$do_update = 0;
if ($_POST[‘up’]) {
print_r($_POST[‘up’]);
echo “print r POSTup
”;
list($key, $value) = each($_POST[‘up’]);
echo "akt.Satz : ".$_POST[‘sort’][$key];
echo “
”;
echo "vor.Satz : ".$_POST[‘sort’][$key-1];
$id_akt_satz = $_POST['id'][$key];
$new_akt_sort = $_POST['sort'][$key-1];
$id_vor_satz = $_POST['id'][$key-1];
$new_vor_sort = $_POST['sort'][$key];
$do_update = 1;
} else if ($_POST[‘down’]) {
print_r($_POST[‘down’]);
echo “print r POSTdown
”;
list($key, $value) = each($_POST[‘down’]);
echo "akt.Satz : ".$_POST[‘sort’][$key];
echo “
”;
echo "vor.Satz : ".$_POST[‘sort’][$key+1];
$id_akt_satz = $_POST['id'][$key];
$new_akt_sort = $_POST['sort'][$key+1];
$id_vor_satz = $_POST['id'][$key+1];
$new_vor_sort = $_POST['sort'][$key];
$do_update = 1;
}
if ($do_update != 0) {
mysql_query(“update master set sort = '”.$new_akt_sort."’ where id = ‘".$id_akt_satz."’") or die(mysql_error());
mysql_query(“update master set sort = '”.$new_vor_sort."’ where id = ‘".$id_vor_satz."’") or die(mysql_error());
}[/code]
Was ich aber erreichen möchte ist, dass die oberste Zeile nach unten verschoben werden kann und das nicht DS für DS sondern mit einmal.
Angenommen die DS sind sortiert Zeile 1 bis 10 aufsteigend, Ich wähle den DS “Zeile 1” dieser DS wird von ganz oben nach ganz unten verschoben. Alle anderen sollen um eine Zeile nach oben verschoben werden.
Guckst Du
Hi Michi,
ich glaube so geht das nicht. Guck mal den Link.
http://guckstdu.bplaced.net/index.php
In dem Textfled in der Spalte Sortnummer, sind die Sortiernummern. Da sieht man wie diese getauscht werden.
Wenn die oberste Zeile nach unten soll und alle anderen Zeilen um eins nach oben, muss ich die Werte untereinander tauschen.
Wie? Ich weiß nicht.
Guckst Du
Kannst du das nicht irgendwie anders sortieren???
Sollte aber irgendwie mit einem durchlaufenden gejointn UPDATE-Befehl gehen
Eine ID dient nie, nie, nie zu etwas anderem, als dem absolut einzigen Zweck, einen Datensatz eindeutig zu identifizieren.
WAAH, noch schlimmer.
Im Endeffekt ist der Datensatz ja auch eindeutig identifizierbar, natürlich dürfen dann keine externen Verweise auf diese ID bestehen…
Ich habe nicht gesagt, dass er das nicht wäre.
Aber dass dies der absolut einzige Zweck einer ID ist - sie wird nicht zum Sortieren verwendet, nicht zum Filtern, für gar nichts anderes.
Das ist eines der absoluten „Grundgesetze“ beim Umgang mit Datenbank-Daten (und demnach auch der Datenmodellierung).
Das hast du vollkommen Recht, so habe ich das auch gelernt.
Hier ist es dann angebracht, dafür eine weitere Spalte anzulegen, zb ‘sort’, welche dann zum sortieren verwendet wird.
Ist auf jeden Fall sauberer, und nicht viel aufwändiger…
Hallo,
ich freue mich ja, das solch eine angeregte Diskussion entstand, aber kann mir jemand helfen;)
Im Prinzip, müsste die oberste Sortnummer die unterste werden und alle anderen mit dem Vorgänger tauschen.
GuckstDu (ratlos;))