Mysql Query während Auswertung einer Query

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hallo,


    Vorab: Ich nutze StrickenKid.


    Ich habe eine ganz normale Query: Etwas wird aus der Datenbank gelesen.
    In Einer While-Schleife geht er alle Reihen durch und schreibt mithilfe von sscanf (plugin) die Werte aus den Feldern in die entsprechenden Variablen.


    Alles wunderbar.


    Nun möchte ich aber unter umständen (je nach dem wie die Werte in einer Spalte sind, entsprechend Datensätze löschen.
    Also sende ich eine DELETE-query. Im ersten Durchlauf wird der entsprechende Datensatz gelöscht, danach kommt die Error-Meldung
    "Error (0): Function: mysql_store_result called when no result stored."


    Folgendermaßen ist es aufgebaut:

    Hier ist es nochmal zu sehen: Erst wird eine normale Query an die Datenbank gesendet, das Ergebnis wird gepseichert, ist in einem bestimmten Feld pro Reihe ein bestimmter Wert soll ein bestimmter Datensatz gelöscht werden, ansonsten wird mit den Daten gearbeitet.
    Am Ende wird das Ergebnis freigegeben.


    Sollte die Frage kommen, wieso ich einen bestimmten Datensatz löschen möchte: Die SELECT Abfrage erstreckt sich über 2 Tabellen. für ein bestimmtes Fahrzeug soll aus 2 Tabellen bestimmte Werte gelesen werden. ist in der einen Tabelle ein bestimmter Wert nicht so wie er sein sollte, wird der Datensatz aus der anderen Tabelle gelöscht, da dann irgentetwas nicht stimmt (Datensätze wurden manuell und falsch in die Datenbank eingefügt).


    Ich denke das Problem liegt dabei, das ich keine query ausführen kann, während ich mit dem Ergebnis einer anderen query noch arbeite. Da dies mit den Ergebnissen nicht hinhaut. Bin mir da aber nicht sicher, weshalb ich hier nachfrage,
    Ich hatte bereits die Überlegung, alle Datensetze die gelöscht werden sollen zwischen zu speichern und erst nach dem freigeben des Ergebnis die Datensätze zu löschen.
    Das Problem hierbei: Es ist immer ungewiss ob überhaupt Datensätze gelöscht werden sollen und wenn ja ist nicht klar, wieviele gelöscht werden müssen. Ich kann jedoch kein Array mit einer dynamischen Größe erstellen.


    Eventuell liegt das Problem jedoch auch woanders.

  • Nabend


    Du liegst mit deiner Vermutung völlig richtig.
    Durch den Aufruf eines weiteren Querys wird das result geleert und kann somit nicht mehr weiter verarbeitet werden.


    Eine mögliche Lösung wäre erstmal alles aus zu lesen und anschließend in einer zweiten Schleife um das Array den Abgleich zu machen ob du es löschen möchtest.
    Theoretisch sollte es auch möglich sein eine zweite Connection zu öffnen womit das ganze wiederum in einer Schleife funktionieren sollte. Muss aber zugeben das habe ich in Pawn noch nie versucht :D


    Mit freundlichen Grüßen
    Finished

  • Ich habe eine andere Idee.


    Undzwar kann ich vorab schon alle Datensätze löschen, die da nicht reingehören.


    Das Problem ist:


    Ich habe 2 Tabellen. Wenn der Wert eines Feldes aus der 1. Tabelle = 'x' ist, soll der Datensatz mit der ID (primary Key) aus Tabelle 1 in Tabelle 2 gelöscht werden (da ist die ID aus Tabelle 1 als Fremdschlüssen hinterlegt).


    Lösungsansatz: Subquery:


    DELETE FROM Table2 WHERE Column IN (SELECT Column FROM Table1) = 'x' AND table2.Fremdschlüssel = table1.Primärschlüssel;


    Nur leider funktioniert diese Query nicht so ganz :/

  • Ich kanns ja leider nicht testen aber versuch es mal so (ich bin mir nicht sicher ob alle ergebnisse abgearbeitet werden):


    DELETE FROM Table2 WHERE id IN (SELECT id FROM Table1 WHERE Column = 'x' )


    //Edit: Zur erklärung... Die Beziehung wird durch den Abgleich der Id´s in der WHERE Clause Sichergestellt

  • Hast du meine Query mal getestet?
    Wenn du mal deine Query in Wortenaufschreiben würdest merkste glaube ich woran es liegt.
    Lösche alles vom Autohof, wenn Abgeschleppt in Abgeschleppt enthalten ist und den Wert 0 hat und die CarId aufm Autohof der Carid des Spielers entspricht.


    Doffe Frage: Willst du alle Einträge vom Autohof löschen wenn abgeschleppt in der Account tabelle 0 ist? Wenn ja mach es doch so:
    DELETE FROM `Autohof` WHERE Carid IN (SELECT ID FROM accounts_Autos WHERE Abgeschleppt = 0)