SQL 1. Eintrag in der Tabelle nach hinten verschieben

smiile

Lt. Commander
Registriert
März 2011
Beiträge
1.099
1. Eintrag in der Tabelle nach hinten verschieben [UPDATE]

Hallo,

ich habe ein Problem, und zwar möchte ich folgendes:

Anhand einer von mir geschriebenen Funktion werden Einträge in eine Tabelle geschrieben.
Diese Einträge können anschließend von einem Benutzer abgefragt werden.
Wenn ein Benutzer diesen Eintrag falsch beantwortet, wird der Eintrag "verschoben".
Die Tabelle ist mithilfe eines Merkers in 6 Fächer unterteilt. Jeder Eintrag bekommt standardmäßig den Merker "1". Wird nun ein Eintrag korrekt beantwortet, bekommt er den Merker "2". Falls falsch, behält er den Merker "1". Nun das Problem: Ich möchte nun den soeben falschen Eintrag NICHT noch einmal abfragen, sondern den 2. Eintrag innerhalb der Tabelle. Den soeben falsch Beantworteten Eintrag möchte ich sozusagen "hinten an die Tabelle schreiben, und vorne soll der 2. Eintrag aufrücken."

Ich hoffe ihr versteht so grob mein Problem. Bei Fragen stehe ich sehr gerne zur Verfügung.

PS: Ich möchte hier keine fertigen Lösungen sondern nur einen Denkansatz oder eine mögliche vorhandene Funktion, mit der ich das Problem lösen kann.

Gruß
smiile
 
Zuletzt bearbeitet:
Die Tabelle im Datenbanksinn ist nur eine Datenhalde. Verschieben macht da keinen Sinn.
Wenn du die Einträge mit 2 nicht sehen willst, dann schreib in dein Select Statement doch einfach
WHERE Merker = 1 rein.
 
Alle Daten holen und der Reihe nach durchgehen.
Beim zweiten mal durchgehen, alle mit 2 ignorieren.
 
Hm, nee das ist bisschen die Falsche Richtung.

Mir geht es darum, Einträge die den Merker 2 besitzen, werden sofern man sie falsch Beantwortet, wieder mit dem Merker 1 versehen. Das Problem liegt ausschließlich im "Fach 1"( Merker 1 ). NUR hier, gibt es das Problem, dass ich sage wenn man den Eintrag falsch beantwortet, bekommt er einfach den Merker 1. Da der Merker 1 aber schon vorhanden ist, wird der selbe Eintrag immer und immer wieder abgefragt, bis man ihn Richtig beantwortet.

Edit: Der Benutzer kann selbst Entscheiden, ob er Merker 1 oder Merker 2 möchte. Das ist nicht das Problem, sondern eben nur die Tatsache dass ich sage jeder falsch beantwortete Eintrag bekommt Merker 1. Auch wenn der Eintrag ihn schon besitzt.
 
Also wenn Merker eine Spalte ist, dann geh doch einfach hin und setz ihn für falsch auf 3 ... und dnan fragst du immer nur 1 ab?!
 
Ja, Merker ist eine Spalte.

Hm, ja hab mir auch schon sowas in der Art überlegt, aber dass ich ihn auf 0 setze, da ich 1-6 brauche...allerdings möchte ich ja die Einträge trotzdem abfragen, aber erst nachdem ALLE mit Merker 1 abgefragt wurden. Zugleich soll man aber die Möglichkeit haben sich die Komplette Tabelle ausgeben zu lassen, dann hätte ich das Problem, dass mir Einträge aus dem "Fach 1" fehlen würden.
 
also ... wenn du ALLE abfragen willst, kannst du ja einfach die bedingung mit dem merker weglassen.
eigentlich sollte sich alles mit if abfragen lösen lassen. if merker=1 or merker=0 ... blablabla ... gibt viele möglichkeiten ... musst du vielleicht nochmal neu erklären was mit den 6 fächern gemeint ist und wie du die fragen stellst .. also wann welche fragen und wann welche fragen nicht
 
Ich würde je Eintrag ein zweites Attribut hinzufügen, so was wie eine "rowid" (Zeilennummer, oder Index). Zu Beginn hat der erste Eintrag die rowid = 1, der zweite Eintrag die rowid= 2 usw.

:Loop Beginn

Nun sortierst du die Einträge aufsteigend nach rowid.

Nun wird der erste Eintrag in der sortierten Liste abgefragt. Darauf erhält er als neue rowid := (höchste rowid)+1.

:Loop Ende

Ist eigentlich so was ähnliches wie eine Queue - das erste Element wird dabei hinten wieder angehängt. Und wenn ich dich richtig verstanden habe, läuft das eigentlich unabhängig vom "Merker" ab.

Wenn ich nochmal mein Geschreibsel durchlese muss ich feststellen, dass es sicher eine elegantere Lösung geben müsste ;)
 
Zuletzt bearbeitet:
Das ganze hört sich für mich nach einem Vokabeltrainer an.

Wenn der Merker also für das Fach steht, würde ich jedem Datensatz eine weitere Spalte mit einem Zähler ausstatten (AnzahlFalsch) und diesen bei einer falschen Antwort nach oben Zählen lassen.
Dann fragst du halt nach Merker 1 und dem kleinsten Wert in der Spalte AnzahlFalsch ab. Bei einer richtigen Antwort setzt du den Merker eins höher und Anzahl Falsch wieder auf 0.
 
Oder statt eines Zählers eine neue Spalte mit einem TIMESTAMP = Datum und Uhrzeit der letzten Bearbeitung verwenden. Dann beim Lesen den am weitesten zurückliegenden zuerst anzeigen.
 
Wenns dir einfach nur darum geht _immer_ bei ner falschen Antwort den Eintrag in der Liste ganz nach hinten zu packen (also wie einen Haufen Karteikarten), dann erstell doch einfach eine zusätzliche Spalte (z.B. mit dem Namen "time_order") und Datentyp DATETIME. Wenns falsch beantwortet wurde trägst du dort immer das aktuelle Datum+Uhrzeit ein. Wenn du beim Query aufsteigend nach "time_order" sortierst bekommst du genau diese Karteikarten-Eigenschaft.
 
Das ist mit Sicherheit eine gute Lösung, würde aber bei mir auch wieder nich passen. :/
Da tritt dann ein anderes Problem auf. Wenn ich dann z.B. Einträge von 1-10 habe, und dann beantworte ich 2 davon richtig, dann hab ich nurnoch einen Index von 2-10 mit dem Merker 1, da ich ja letztendlich nur den Merker 1 ändere, um so einen "Fach swap" zu simulieren.

Ich denke der Ansatz mit Merker auf 0 zu setzen ist ganz in Ordnung und ausreichen für meine Anforderungen...nur happert es nun zu sagen, wenn ich alle Einträge mit Merker 1 abgefragt habe, sollen die mit Merker 0 drankommen ABER zugleich wenn ich die Einträge anzeigen möchte, sollen die mit Merker 1 UND Merker 0 angezeigt werden. -> Problem: Merker wird auch angezeigt, wäre dann ein gemisch aus 0 und 1 was mir wiederum zu unschön wäre. Bin leider ein totaler Laie auf dem Gebiet von MySQL :)
Ergänzung ()

IceMatrix schrieb:
Wenns dir einfach nur darum geht _immer_ bei ner falschen Antwort den Eintrag in der Liste ganz nach hinten zu packen (also wie einen Haufen Karteikarten), dann erstell doch einfach eine zusätzliche Spalte (z.B. mit dem Namen "time_order") und Datentyp DATETIME. Wenns falsch beantwortet wurde trägst du dort immer das aktuelle Datum+Uhrzeit ein. Wenn du beim Query aufsteigend nach "time_order" sortierst bekommst du genau diese Karteikarten-Eigenschaft.

Das hört sich auch sehr sehr schön an ;)

Edit: NUR wenn Merker auf 1 steht soll das passieren.

Werd ich mir sofort näher anschauen.
Ergänzung ()

Hm hab mir das jetzt bisschen angeschaut, und hab dazu die Funktion now() gefunden...allerdings is mir schleierhaft, wie ich nun jedem Eintrag den ich mache mit dem aktuellen Datum versehen kann ? Ich dachte dass man das irgendwie in eine Variable schreiben kann, welche jedes mal beim anlegen einer Karteikarte neu beschrieben wird und anschließened in die Tabelle geschrieben wird.
 
Zuletzt bearbeitet:
So, habe nun eine für mich ausreichende Lösung angefertigt...Zusätzliche Spalte Namens "Check" jedem Eintrag hinzugefügt. Check wird 1 wenn ein Eintrag im 1. Fach fehlerhaft beantwortet wurde. Es werden nun erst alle Einträge mit Check = 0 abgefragt und danach die mit Check = 1. Nun habe ich aber ein Problem, wenn die Einträge mit Check = 1 abgefragt werden, gibt es ein Syntax Query error...dieser tritt auf, wenn ich den Eintrag ins 1. Fach schiebe und/oder wenn ich den Eintrag ein Fach weiter schieben möchte, aber NUR bei den Einträgen, die die Eigenschaft Check = 1 besitzen.

In folgenden Zeilen tritt der Fehler auf:

Eintrag weiterschieben:

$sql = "UPDATE `datenbank`.$tabelle SET `Check` = 0 WHERE $tabelle.`ID` = $eintrag_id And $tabelle.`Check` = 1";
$ergebnis = mysql_query( $sql, $verb_id ) or die( "Query error: ".mysql_error() );

Fehler dazu: Query error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'And Test.`Check` = 1' at line 1

Eintrag zurücklegen:

$sql = "UPDATE datenbank.$tabelle SET `Check` = 1 WHERE $tabelle.`ID` = $eintrag_id And $tabelle.`Fach` = 1 And $tabelle.`Check` = 0";
$ergebnis = mysql_query( $sql, $verb_id )or die("Query error: ".mysql_error());

Fehler dazu: Query error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'And Test.`Fach` = 1 And Test.`Check` = 0' at line 3
 
Zuletzt bearbeitet:
und wie bildest du ab das es mehre benutzer gibt?
ein erm oder ähnliches würde hier hilfreich sein
 
@smiile: les dir doch erstmal die manuals von mysql durch. da steht drin wie eine abfrage aussehen muss (mit beispielen). außerdem ist der code von dir sehr sql injection verdächtig.
 

Ähnliche Themen

Zurück
Oben