Datenbank: Inkonsistenzabfrage
Andreas-Lindig
- datenbank
0 Frank
Hallo Datenbankfreaks!
wie kann man aus MySql eine Zwischentabelle speichern?
Ich habe diese Abfrage:
//alle Datensaetzte aus 'zutaten' plus die Schnittmenge zu 'listing' abfragen
//dort, wo 'listing' keinen Datensatz enthält
select * from zutaten left join listing on zutaten.id=listing.zutat_id
where listing.zutat_id is null
Ich suche also die 'toten' Datensaetze aus 'zutaten', die keinen Bezug mehr zu 'listing' haben.
Soweit so gut. Aber wie kann ich diese Daensaetze aus der Tabelle 'zutaten' loeschen?
Ich wollte die Ergebnismenge als DUMP oder aehnlich speichern, um davon eine eigene Tabelle zu machen, und dann mithilfe der Id's die richtigen Datensaetze in 'zutaten' zu finden, aber wie geht das? In Acces nennt sich das, soweit ich weiss, 'Inkonsistenzabfrage' und geht in einem Rutsch. Das erwarte ich gar nicht, aber geht das ueberhaupt in MySql?
Gruß, Andreas
Hi,
in der MySQL Doku steht zu diesen Themen etwas ab Chapter 1.7.4
Dort wird erwähnt, dass es keine Möglichkeiten für Subselects (mit WHERE ... in (Select ...)) gibt, diese sich jedoch umschreiben lassen. Erwähnt wird hierbei auch die mySQL-Erweiterung Concat(), welche dir weiterhelfen könnte.
Viele Grüße, Frank
*prust*
Ein andere Ansatz wäre eine DB von vorne herein so anzulagen, daß Inkonsistenzen erst gar nicht auftretten können. Beim anlegen einer Tablelle gibt es mehr als ein CREATE, da gibts auch noch so Sachen wie ForeignKey die man mit CONSTRAINTS versehen kann um die zur "Laufzeit" bearbeiten oder entfernen zu können. So vermeidet man diese Probleme komplett da das DBMS erst gar nicht solche Inkonsistenzen zu läst.
Shir Khan, the tiger
GVT
Hi,
in der MySQL Doku steht zu diesen Themen etwas ab Chapter 1.7.4
Dort wird erwähnt, dass es keine Möglichkeiten für Subselects (mit WHERE ... in (Select ...)) gibt, diese sich jedoch umschreiben lassen. Erwähnt wird hierbei auch die mySQL-Erweiterung Concat(), welche dir weiterhelfen könnte.
Viele Grüße, Frank
*prust*
aha!
Ein andere Ansatz wäre eine DB von vorne herein so anzulagen, daß Inkonsistenzen erst gar nicht auftretten können [...] So vermeidet man diese Probleme komplett da das DBMS erst gar nicht solche Inkonsistenzen zu läst.
Ich glaube, hier liegt ein Mißverständnis vor. Es kann durchaus den Fall geben, daß ich Einträge in einer Tabelle behalten WILL, weil ich sie (in diesem Falle Mögliche Zutaten zu Speisen) später wieder aufrufen können will.
Stell Dir ein anderes Beispiel vor: Ein Fahrradverleih speichert Fahrräder, Kunden, Ausleihdaten(Datum, Dauer etc.). jetzt will jemand wissen, welche Räder noch frei sind, (also NICHT in der Ausleihtabelle stehen). Willst Du nach jedem Ausleiheintrag etwa eine Tabelle 'freie Räder' aktualisieren?
Übrigens: wenn Du in Deinen SQL-Abfragen soooviele Syntaxfehler wie hier Rechtschreibfehler hast, na dann...
Gruß, Andreas
Hallo!
Stell Dir ein anderes Beispiel vor: Ein Fahrradverleih speichert Fahrräder, Kunden, Ausleihdaten(Datum, Dauer etc.). jetzt will jemand wissen, welche Räder noch frei sind, (also NICHT in der Ausleihtabelle stehen). Willst Du nach jedem Ausleiheintrag etwa eine Tabelle 'freie Räder' aktualisieren?
Ich muß unserem Tiger absolut Recht geben. Wenn Du schon Inkonsistenten bewußt mit einplanst ist irgendwas an Deiner Datenbank nicht ganz richtig!
Jetzt mal auf die Fahrräder bezogen, ich würde mich da zwischen 2 Möglichkeiten entscheiden, kommt drauf an ob Dir die bloße Information ausgeliehen oder nicht reicht. Voraussetzung Du hast in der Tabelle Fahrräder pro Fahrrad einen Datensatz:
Einfach in diese Tabelle ein Feld "Ausgeliehen" Einfügen und dieses beim vewrlei auf 1 setzen, und bei der Rückgabe auf 0, dann kannst Du recht einfach abfragen "...WHERE ausgeliehen = 0"
Wenn Du aber keine Tabelle hast, in der ein Datensatz pro Fahrrad existiert, oder Du mehr informationen über den Verleih speichern willst, dann mache eine Tabelle "Verleih", und speichere darin alle relevanten Daten(FahrradID, start, ende...), dann kannst Du auch hier recht einfach abfragen, welche Fahrräder noch da sind. Komplizierter wirds wie gesagt, wenn Du die Anzahl der Fahrräder als Zahl in der Tabelle Fahrräder speicherst, dann würde ich mit Group by die Summe der ausgeliehenen Fahrräder über die Tabelle "Verleih" ermitteln, und dann per Left Join mit der vorhandenen Anzahl in "Fahrräder" vergleichen. Aber kommt ganz drauf an wie Du was in deiner DB speicherst, vielleicht mußt Du es ganz anders machen, das kann ich aber anhand Deiner angaben so nicht sagen. Was ich sagen kann ist das man Inkonsistenzen nicht einplanen _darf_!
Grüße
Andreas
PS: Sorry wegen der vielen Fehler, ich hoffe Du kannst noch grob verstehen was gemeint war!