Zur Navigation

DB-Datensätze sortieren

1 AndiN

Hallo

ich habe eine SQL-Tabelle mit folgendem Aufbau:

ID name     position
1  kirsche      2
2  banane       1
3  apfel        3
4  birne        5
5  traube       4

Der User kann per Inputfeld die Sortierung ändern. Das Script hierfür sieht wie folgt aus:
$new = Position auf welche der zu sortierende Eintrag springen soll
$idakt = ID des zu verschiebenden Eintrags

$query1 = "mysql_UPDATE themen SET Position = 0 WHERE ID = $idakt";
mysql_query($query1);
if($new<$old)
{
   $query2 = "UPDATE themen SET Position = Position+1 WHERE Position >= $new AND Position < $old";
   mysql_query($query2);
   $query3 = "UPDATE themen SET Position = $new WHERE ID = $idakt";
   mysql_query($query3);
}
else
{
   $query4 = "UPDATE themen SET Position = Position-1 WHERE Position > $old AND Position < $new";
   mysql_query($query4);
   $query5 = "UPDATE themen SET Position = $new-1 WHERE ID = $idakt";
   mysql_query($query5);
}

Das alles funktioniert auch schon. Jetzt zu meinem Problem:

Ich möchte die SQL-Tabelle wie folgt erweitern:

ID name     position   themenID
1  kirsche      1          1
2  banane       1          2
3  apfel        2          2
4  birne        2          1
5  traube       3          2

Ich füge also eine Spalte ein welche die Einträge nach Themen unterscheidet. Einträge eines Themas sollen unabhängig von den anderen sortierbar sein. D.h. Wenn ich mich in dem Theme mit der themenID = 2 befinde und dort die Sortierung ändere sollen nur "banane", "apfel" und "traube" neu sortiert werden.

Ich habe es mal so versucht:

$query1 = "mysql_UPDATE themen SET Position = 0 WHERE ID = $idakt";
mysql_query($query1);
if($new<$old)
{
   $query2 = "UPDATE themen SET Position = Position+1 WHERE Position >= $new AND Position < $old AND mpID = $umpID";
   mysql_query($query2);
   $query3 = "UPDATE themen SET Position = $new WHERE ID = $idakt";
   mysql_query($query3);
}
else
{
   $query4 = "UPDATE themen SET Position = Position-1 WHERE Position > $old AND Position < $new AND mpID = $umpID";
   mysql_query($query4);
   $query5 = "UPDATE themen SET Position = $new-1 WHERE ID = $idakt";
   mysql_query($query5);
}

Funktioniert leider nur fast.

Bsp.: Verschieben von "traube" auf position "2".

VORHER
ID name     position   themenID
1  kirsche      1          1
2  banane       1          2
3  apfel        2          2
4  birne        2          1
5  traube       3          2

NACHHER
ID name     position   themenID
1  kirsche      1          1
2  banane       1          2
3  apfel        2          2
4  birne        2          1
5  traube       2          2

"traube" rutscht zwar auf Position "2", allerdings rutscht der "apfel" nicht auf Position "3".

Richtig sollte es so aussehen:
ID name     position   themenID
1  kirsche      1          1
2  banane       1          2
3  apfel        3          2
4  birne        2          1
5  traube       2          2

Hat jemand Ideen, Tipps, Lösungsvorschläge?

21.01.2009 12:27

2 Jörg

Wie sieht denn die Abfrage aus, in welcher $umpID festgestellt wird?

21.01.2009 13:29

3 AndiN

Es gibt noch eine zweite Tabelle "db_menuepunkte" mit folgendem Aufbau:

ID name          mainmp
1  unterseite1   menuepunkt1 
2  unterseite2   menuepunkt1 
3  unterseite3   menuepunkt2

Stelle dir das ganze als Baumstruktur vor:

Menüpunkte (mainmp) => Unterseiten (name)

In den Unterseiten liegen Themen welche ich sortieren möchte. Die Themen liegen in der Tabelle vom Anfang (nennen wir sie "db_themen"). Welche Themen zu welcher Unterseite gehören finde ich also über die Spalte "mpID" raus.

Aus der Tabelle "db_menuepunkte" hole ich alle Unterseiten raus und verteile sie je nach Hauptmenüpunkt auf verschiedene Arrays. Als Beispiel habe ich unten die if-Abfrage für den Menüpunkt "menuepunkt1" gepostet. Dann lese ich den Titel sowie die ID der Unterseiten aus und übergebe sie dem Sortierung-Script

$sql = mysql_connect($host,$user,$pword);
mysql_select_db($db,$sql);
$query = "SELECT ID,name,mainmp FROM menuepunkte";
$connect = @mysql_query($query) or die(mysql_error());
while($val = mysql_fetch_object($connect))
{
	$umpsiteID = $val -> ID;
	$mainmp = $val -> mainmp;
	$mp_name = $val -> name;

	if($mainmp == "menuepunkt1")
	{
		$array_umplinks[] = $umpsiteID;
		$mpname[] = $mp_name;
	}
}
$umpcounter = 0;
foreach ($mpname as $ump)
{
?>
<li><a href="index.php?&umpID=<?php echo $array_umplinks[$umpcounter]; ?>"><?php echo $ump; ?></a></li>
<?php
}
?>

Ich habe per echo gesehen, dass im 1. Query auch die richtige ID der zu verschiebenden Seite steht. Ich denke daher, dass irgendwas mit der WHERE-Anweisung nicht stimmt.

21.01.2009 13:59

4 Jörg

Ich denke daher, dass irgendwas mit der WHERE-Anweisung nicht stimmt.

Ja, ich auch - deswegen meine Frage nach $umpID - denn darin unterscheidet sich die Abfrage von den funktionierenden Abfrage im ersten Beispiel

Was ergibt denn "echo $query2;"?

21.01.2009 14:06 | geändert: 21.01.2009 14:06

5 AndiN

Ich poste dir hier mal wie die Querys aussehen wenn ich das Thema mit der ID 164 auf der Seite mit der mpID 1 von Position 3 auf 2 verschieben möchte:

query1:
mysql_UPDATE themen SET Position = 0 WHERE ID = 164

query4:
UPDATE themen SET Position = Position-1 WHERE Position > 3 AND Position < 3 AND mpID = 1

query5:
UPDATE themen SET Position = 3-1 WHERE ID = 164

Das "3-1" im Query 5 kommt mir etwas spanisch vor.

21.01.2009 14:11

6 Jörg

Diese Bedingung kann nicht erfüllt werden:

WHERE Position > 3 AND Position < 3

21.01.2009 14:32 | geändert: 21.01.2009 14:35

Beitrag schreiben (als Gast)

Beim Verfassen des Beitrages bitte die Forenregeln beachten.





[BBCode-Hilfe]