SQL, Bubble mit SQL
Tom
- datenbank
0 Ludger Keitlinghaus0 Tom
0 fk0 Christian Kruse0 Tom0 Ludger Keitlinghaus0 Tom
0 fk0 Tom0 fk0 Ludger Keitlinghaus
Hello,
in einer Tabelle stehen Produkte, die in einer bestimmten Reihenfolge angezeigt werden sollen.
Dafür hat die Tabelle eine Spalte "sort", in der einfach laufende Nummern eingetragen sind.
Um nun zwei Produkte auszutauschen muss man ja "nur" die Sortierschlüssel austauschen.
Wie macht man das am effektivsten?
Außerdem können auch Produkte gelöscht und hinzugefügt werden.
Wie solle man da mit dem Sortierschlüssel verfahren?
Gibt es eine gute Idee, wie man diese Schlüsselspalte am einfachsten reorganisieren kann?
Bin mir auch noch nicht klar darüber, ob überhaupt ein geschlossener Nummernkreis vorhanden sein muss.
Allerdings ist bei einem geschlossenen Nummernkreis das Tauschen mit nur einem Statement möglich. Zwei einzelne voneinander abhängige Updates müsste man durch ein Lock binden, was die Performance im konkurrierenden Betrieb beinträchtigt.
Gibt es eine Möglichkeit, ein update-Statement nur dann ausführen zu lassen, wenn die Menge der davon betroffenen Datensätze mit einer Vorgabe übereinstimmt? Also durch ein where-statement wird eine Elementemenge gefiltert, die dann dem Update unterzogen werden soll. Das darf aber nur dann geschehen, wenn z.B. genau 2 Datensätze in den Filterbereich fallen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
Um nun zwei Produkte auszutauschen muss man ja "nur" die Sortierschlüssel austauschen.
Wie macht man das am effektivsten?
vermutlich mit zwei UPDATE-Anweisungen. (Ich unterstelle mal ein RDBMS, vermutlich MySQL?)
Außerdem können auch Produkte gelöscht und hinzugefügt werden.
Wie solle man da mit dem Sortierschlüssel verfahren?
Ja, das ist ein echtes Problem. So lange die Sortierung willkuehrlich ist, wird es keine "vernuenftige" Loesung geben.
Fordere doch beim Abnehmer Deiner Entwicklungsleistung eine Regelmenge an, die die Sortierung bestimmt. Dann koenntest Du auch auf solch unangenehme Sachen wie das Pflegen der Sortierung in einem Datenfeld verzichten.
Und den Abnehmer wird's auch entlasten (sein Geschaeftsmodell wird einfacher bzw. besser beschrieben). Mach dem ggf. klar, dass er auch bisher bereits eine Regelmenge fuer diesen Zweck nutzt.
Gibt es eine gute Idee, wie man diese Schlüsselspalte am einfachsten reorganisieren kann?
Nein. Widerspricht dem Konzept eines RDBMS, wenn ich das mal so ruppig schreiben darf.
Bin mir auch noch nicht klar darüber, ob überhaupt ein geschlossener Nummernkreis vorhanden sein muss.
Ein geschlossener Nummernkreis sowieso nicht. Wenn's denn nicht anders geht, koenntest Du die Sache implementieren, wie normalerweise Indizes implementiert werden (mit Fuellfaktoren und so ;-). Viel Spass.
Eventuell koenntest Du mit Triggern kommen, falls Dein RDBMS diese unterstuetzen. Aber versuche von solchen Loesungen die Finger zu lassen, denn die angeforderte Sortierung ist _letztlich_nie_willkuehrlich_, denn sonst waere sie ja nicht angefordert. Es _muss_ Regeln geben (auch, wenn ich mich wiederhole ;-).
Gruss,
Ludger
Hello,
Es ist eine MySQL 4-Datenbank, die der Kunde hier auch für andere Sachen benutzt.
Um nun zwei Produkte auszutauschen muss man ja "nur" die Sortierschlüssel austauschen.
Wie macht man das am effektivsten?vermutlich mit zwei UPDATE-Anweisungen. (Ich unterstelle mal ein RDBMS, vermutlich MySQL?)
Das geht auch mit einem Statement, aber nur dann, wenn der Numernkreis der Sortierspalte geschlossen ist, also keine Lücken auftreten.
Gibt es eine gute Idee, wie man diese Schlüsselspalte am einfachsten reorganisieren kann?
Nein. Widerspricht dem Konzept eines RDBMS, wenn ich das mal so ruppig schreiben darf.
Ich würde eine gute Idee benötigen, wie ich die laufende Nummer der Ergebniszeile ermitteln könnte. Diese muss dann als Update-Value für die Sortierschlüssel-Spalte benutzt werden.
Leider funktionieren die Benutzervariablen in MySQL 4 immer noch nicht. Das wäre nämlich dann die passsende Lösung.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello,
noch ne Frage:
wie kann ich mit
Create table neu select * from alt
eine neue Tabelle aufbauen, und genau ein Feld aus der Feldliste der Alten NICHT übernehmen, aber alle anderen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
noch ne Frage:
wie kann ich mit
Create table neu select * from alt
eine neue Tabelle aufbauen, und genau ein Feld aus der Feldliste der Alten NICHT übernehmen, aber alle anderen.
Moment, Du stellst die Bedingung, dass das o.g. Statement fuer Deine Zwecke genutzt werden muss?
Kann ich mir kaum vorstellen, also warum nicht '*' durch eine kleine DF-Liste ersetzen? (Natuerlich nur, wenn's geht mit MySQL. Kann man aber ausprobieren, denke ich.) (Aber, wie gesagt, Du bist ohnehin auf dem Holzweg.)
Gruss,
Ludger
Hello,
nun muss ich für die dynamsiche Sortierung leider doch gebundene Statements für das Reorganisieren der Liste durchführen.
Die Tabelle temp hat nur zwei Felder:
id_temp int auto_increment primary key
id_products int
Im Prinzip kann man die auch für alle Tabellen nutzen, die über eine dynamische Sortierung verfügen. Man benötigt sie ja immer nur für die "Berechnung" der neuen Positionsnummer.
lock tabls temp write, products write;
delete from temp;
insert into temp (id_products) select id_products from products where id_wgr = $warengruppe order by sort;
UPDATE products, temp SET products.sort = temp.id_temp WHERE temp.id_products = products.id_products;
unlock tables;
So funktioniert das. Man muss nun leider nach jedem 'physischen' Löschen die Reorganisation durchführen und dafür auch die Tables solange locken. Ich werde die Applikation also umstricken müssen um nur noch logisch zu löschen und nur noch bei Gelegenheit zu "reorganisieren". Das beinhaltet dann aber auch das Löschen der als gelöscht markierten Sätze.
Ich glaube, so wird es am besten sein. Wenn jemand eine bessere Idee für mich hat, bin ich ganz happy. Es ist schon manchmal eine undankbare Aufgabe, Sachen von jemand anderem zu übernehmen, und nicht mal zu wissen, warum er es nicht mehr fertig machen durfte/wollte/konnte.
[Falls Du es hier liest, melde Dich mal, Sven]
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
[...] Es ist schon manchmal eine undankbare Aufgabe, Sachen von jemand anderem zu übernehmen, und nicht mal zu wissen, warum er es nicht mehr fertig machen durfte/wollte/konnte.
ich weiss warum. Der hat den Abnehmer nicht in den Griff bekommen. Ich vermute auch, dass Dein hier skizziertes Problem ein (wenn nicht der ;-) Beleg dafuer ist.
Du kannst ja mal die aufmerksam lauschende Menge mit der Bereitstellung der Information begleucken, warum und wofuer sowas angefordert ist. (Und warum meine Ausfuehrungen ("Es gibt bereits Kriterien fuer die angeforderte Sortierung, also gibt es auch eine "WHERE-Klausel" fuer diese.") ganz anscheinend gegenstandslos sind.)
Gruss,
Ludger
Hello,
Du kannst ja mal die aufmerksam lauschende Menge mit der Bereitstellung der Information begleucken, warum und wofuer sowas angefordert ist. (Und warum meine Ausfuehrungen ("Es gibt bereits Kriterien fuer die angeforderte Sortierung, also gibt es auch eine "WHERE-Klausel" fuer diese.") ganz anscheinend gegenstandslos sind.)
Das verstehe ich jetzt leider nicht.
Die Sortierung ist dynamisch. Der Anwender will frei enscheiden können, in welcher Reihenfolge seine Produkte in der Liste erscheinen sollen. Es ist auch üblich, die Reihenfolge beliebig oft zu verändern. Was habe ich da jetzt übersehen in Deiner Aussage, dass ich sie nicht verstehen kann?
Welche Where-Klausel hilft mir, die Aufgabe zu lösen?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
Das verstehe ich jetzt leider nicht.
jede Anforderung hat eine Ursache. Die Frage ist also: Warum soll eine bestimmte Sortierung vorliegen? Wenn Du weisst warum, dann kannst Du die Anforderung "ordnungsgemaess" per "ORDER BY"-Klausel (natuerlich nicht "WHERE-Klausel") bearbeiten.
Alles andere waere erst einmal esoterisch.
Gruss,
Ludger
Hello,
Das verstehe ich jetzt leider nicht.
jede Anforderung hat eine Ursache. Die Frage ist also: Warum soll eine bestimmte Sortierung vorliegen? Wenn Du weisst warum, dann kannst Du die Anforderung "ordnungsgemaess" per "ORDER BY"-Klausel (natuerlich nicht "WHERE-Klausel") bearbeiten.
Ja, das tue ich ja auch. ICh versende die 'Order By' Klausel. Dazu müssen aber in der Spalte, die die Sortierung im letzen Glied bestimmt, erstmal die passenden Werte drinstehen.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
jede Anforderung hat eine Ursache. Die Frage ist also: Warum soll eine bestimmte Sortierung vorliegen? Wenn Du weisst warum, dann kannst Du die Anforderung "ordnungsgemaess" per "ORDER BY"-Klausel (natuerlich nicht "WHERE-Klausel") bearbeiten.
Ja, das tue ich ja auch. ICh versende die 'Order By' Klausel. Dazu müssen aber in der Spalte, die die Sortierung im letzen Glied bestimmt, erstmal die passenden Werte drinstehen.
na gut, aber wenn Du die Kriterien fuer die Sortierung speicherst, dann bist Du die Probleme mit der "Sortierungsverwaltung" doch los.
Oder verstehe ich wieder Bahnhof?
Gruss,
Ludger
Hello,
Oder verstehe ich wieder Bahnhof?
Ja, leider. ;-)
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
Ich würde eine gute Idee benötigen, wie ich die laufende Nummer der Ergebniszeile ermitteln könnte. Diese muss dann als Update-Value für die Sortierschlüssel-Spalte benutzt werden.
vermutlich ein "Auto-Wert"? Falls nicht, kennst Du ihn ja bereits, ansonsten hilft eigentlich normalerweise die Dokumentation, oder habe ich da was nicht verstanden?
Gruss,
Ludger
Hello,
Ich würde eine gute Idee benötigen, wie ich die laufende Nummer der Ergebniszeile ermitteln könnte. Diese muss dann als Update-Value für die Sortierschlüssel-Spalte benutzt werden.
vermutlich ein "Auto-Wert"? Falls nicht, kennst Du ihn ja bereits, ansonsten hilft eigentlich normalerweise die Dokumentation, oder habe ich da was nicht verstanden?
Das war auch meine Idee. In der Doku finde ich nichts darüber.
CREATE TABLE temp(
id bigint auto_increment PRIMARY KEY ( id ) SELECT id AS nummer, sort
FROM bk_productmodels
WHERE parentid = 7);
war mein Ansatz.
Habe ich da nun nur einen Syntaxfehler drin, den ich nicht sehe, oder ist eine solche Konstruktion nicht möglich?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Um nun zwei Produkte auszutauschen muss man ja "nur" die Sortierschlüssel austauschen.
Wie macht man das am effektivsten?
das hatten wir doch letztens schon einmal.
2 schlüssel s1 + s2. jeder schlüssel darf nur einmal vorkommen:
update tabelle set s = (s1+s2)-s
where s in (s1, s2)
Allerdings ist bei einem geschlossenen Nummernkreis das Tauschen mit nur einem Statement möglich. Zwei einzelne voneinander abhängige Updates müsste man durch ein Lock binden, was die Performance im konkurrierenden Betrieb beinträchtigt.
der nummernkreis ist egal
Gibt es eine Möglichkeit, ein update-Statement nur dann ausführen zu lassen, wenn die Menge der davon betroffenen Datensätze mit einer Vorgabe übereinstimmt? Also durch ein where-statement wird eine Elementemenge gefiltert, die dann dem Update unterzogen werden soll. Das darf aber nur dann geschehen, wenn z.B. genau 2 Datensätze in den Filterbereich fallen.
nicht direkt, sondern nur als subselect in der bedingung.
aber man kann zuvor einen select count absetzen und dann den update machen.
Hallo fk,
Um nun zwei Produkte auszutauschen muss man ja "nur" die
Sortierschlüssel austauschen.
Wie macht man das am effektivsten?das hatten wir doch letztens schon einmal.
2 schlüssel s1 + s2. jeder schlüssel darf nur einmal vorkommen:update tabelle set s = (s1+s2)-s
where s in (s1, s2)
Intelligente Loesung, bin ehrlich beeindruckt.
Grüße,
CK
Hello,
Um nun zwei Produkte auszutauschen muss man ja "nur" die
Sortierschlüssel austauschen.
Wie macht man das am effektivsten?das hatten wir doch letztens schon einmal.
2 schlüssel s1 + s2. jeder schlüssel darf nur einmal vorkommen:update tabelle set s = (s1+s2)-s
where s in (s1, s2)Intelligente Loesung, bin ehrlich beeindruckt.
Ich hatte es mit
update tabelle set s = if(s=s1,s2,s1) where s in (s1,s2);
Beide Lösungen haben aber für meine Aufgabenstellung eine Macke. Es sollen zwei in der menge aller s aufeinanderfolgende Datensätze getauscht werden. Es ist nur der Schlüssel s1 explizit bekannt, der Schlüssel s2 muss durch s2=s1-1 oder s2=s1+1 ermittelt werden.
Dafür ist der geschlossene Nummernkreis notwendig. Oder irre ich mich da. Außerdem müssen die Grenzen berücksichtigt werden. Am unteren Ende ist das kein Problem, da der erste Schlüssel auch mit 1 festgelegt sein kann. Allerdings ist am oberen Ende wieder nichts ohne Abfrage möglich, da die Anzahl der in der Liste befindlichen Sätze nicht festgelegt ist.
Der Tausch darf also nur stattfinden, wenn beide Schlüssel vorhanden sind. Ich habe schon gegrübelt, ob man das mit einem SelfJoin prüfen könnte.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
Der Tausch darf also nur stattfinden, wenn beide Schlüssel vorhanden sind. Ich habe schon gegrübelt, ob man das mit einem SelfJoin prüfen könnte.
wenn Du "solche Loesungen" an den Start bringen willst dann musst Du auch mit Transaktionen oder besser gleich mit "DB-Reparaturroutinen" kommen.
Gruss,
Ludger
Hello,
Der Tausch darf also nur stattfinden, wenn beide Schlüssel vorhanden sind. Ich habe schon gegrübelt, ob man das mit einem SelfJoin prüfen könnte.
wenn Du "solche Loesungen" an den Start bringen willst dann musst Du auch mit Transaktionen oder besser gleich mit "DB-Reparaturroutinen" kommen.
Ich selber würde professionelle Anwendungen gar nicht (mehr) mit MySQL machen, weil die Lizenzkosten für die DB in keinem gesunden Verhältnis zur Leistung stehen. Da ist die Linux-Variante von Informix wesentlich besser. Ich ärgere mich auch, dass ich mich vor ein paar Jahren bequatschen lassen habe, für kleine Webanwendungen mit MySQL rumzuhantieren. Aber angeblich wollte dei Kunden das ja.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
Ich selber würde professionelle Anwendungen gar nicht (mehr) mit MySQL machen, weil die Lizenzkosten für die DB in keinem gesunden Verhältnis zur Leistung stehen. Da ist die Linux-Variante von Informix wesentlich besser. Ich ärgere mich auch, dass ich mich vor ein paar Jahren bequatschen lassen habe, für kleine Webanwendungen mit MySQL rumzuhantieren. Aber angeblich wollte dei Kunden das ja.
sorry, ich meinte die Anfoderungslage ist strange. Aber noch zwei konstruktive Vorschlaege:
eventuell kommst Du mit einer Tabelle, die die Sortierungen haelt
eventuell kommst Du "trocken" mit einem String (varchar), der die Sortierungen verwaltet, auch dieser sollte in einer Tabelle gespeichert werden (geht natuerlich nur, wenn Du sicher sein kannst, dass nicht allzu viele Datensaetze "reinkommen".)
Gruss,
Ludger
Hello,
sorry, ich meinte die Anfoderungslage ist strange.
Die Anforderung ist eine ganz normale, die in kaufmännischen und technischen Applikationen bestimmt schon seit 30 jahre gehandhabt wird, aber benen noch nicht so oft in Internet-Applikationen für die Branchenbereiche.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
sorry, ich meinte die Anfoderungslage ist strange.
Die Anforderung ist eine ganz normale, die in kaufmännischen und technischen Applikationen bestimmt schon seit 30 jahre gehandhabt wird, aber benen noch nicht so oft in Internet-Applikationen für die Branchenbereiche.
also ich kenne diese Anforderung (mir kommen auch schon haeufiger mal Anforderungen der ganz verrueckten Art auf den Tisch, diese muessen zusammen mit dem Abnehmer "abgefeilt" werden) nicht. Da sind Datensaetze, die irgendwie sortiert werden sollen, aber die Kriterien liegen nicht vor. D.h. es wird willkuehrlich durch Mitarbeiter sortiert.
Ich empfinde sowas nicht als natuerlich, denn irgendwelche Kriterien muss es ja geben. Und sind diese bekannt, kann man eine ganze Menge Komplexitaet aus der Sache nehmen.
Die Pflege einer Sortierung unbekannter Art in einem Datenfeld ist fuer mich absolut strange.
Gruss,
Ludger
Hello,
Da muss nichts gefeilt werden, sondern einfach die Aufgabe gelöst werden.
Diese Aufgabe gibt es auch in jedem guten CMS, aber das arbeitet dann eben nicht mit eine Datanbank wie MySQL, sondern mit professionellen Lösungen.
Mein Problem sind hier nur die fehlenden Subselects.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
Da muss nichts gefeilt werden, sondern einfach die Aufgabe gelöst werden.
Diese Aufgabe gibt es auch in jedem guten CMS, aber das arbeitet dann eben nicht mit eine Datanbank wie MySQL, sondern mit professionellen Lösungen.Mein Problem sind hier nur die fehlenden Subselects.
dann verrate doch einfach mal den Sinn der beschriebenen Sortierung. Ich bin mittlerweile so neugierig, dass ich 3 (drei!) Kinder Buenos als Praemie fuer den Verrat aussetze.
Gruss,
Ludger
Beide Lösungen haben aber für meine Aufgabenstellung eine Macke. Es sollen zwei in der menge aller s aufeinanderfolgende Datensätze getauscht werden. Es ist nur der Schlüssel s1 explizit bekannt, der Schlüssel s2 muss durch s2=s1-1 oder s2=s1+1 ermittelt werden.
wenn dir nicht bekannt ist, wer mit wem tauschen soll, ist die aufgabe nicht lösbar.
wenn du mit einem nachbarn tauschen möchtest, muß zumindest bekannt sein, ob dies der linke oder rechte sein soll.
Dafür ist der geschlossene Nummernkreis notwendig. Oder irre ich mich da. Außerdem müssen die Grenzen berücksichtigt werden. Am unteren Ende ist das kein Problem, da der erste Schlüssel auch mit 1 festgelegt sein kann. Allerdings ist am oberen Ende wieder nichts ohne Abfrage möglich, da die Anzahl der in der Liste befindlichen Sätze nicht festgelegt ist.
wenns denn keinen nachbarn zur linken oder rechten gibt, kann auch nicht getauscht werden.
Der Tausch darf also nur stattfinden, wenn beide Schlüssel vorhanden sind. Ich habe schon gegrübelt, ob man das mit einem SelfJoin prüfen könnte.
daher muß man prüfen, obs einen nachbarn auf der seite gibt.
dazu muß die where bedingung um einen subselect erweitert werden.
wenn dies nicht geht, muß man das vorher separat machen.
Hello,
wenns denn keinen nachbarn zur linken oder rechten gibt, kann auch nicht getauscht werden.
Der Tausch darf also nur stattfinden, wenn beide Schlüssel vorhanden sind. Ich habe schon gegrübelt, ob man das mit einem SelfJoin prüfen könnte.
daher muß man prüfen, obs einen nachbarn auf der seite gibt.
dazu muß die where bedingung um einen subselect erweitert werden.
wenn dies nicht geht, muß man das vorher separat machen.
Genau das war die Überlegung. Da das Ganze auch auf MySQL 3.x laufen soll, such ich jetzt nach einer gemeinsamen Lösung. "Echte" Subselects scheiden da aus. Aber wie sieht es aus mit SelfJoins? Ich habe das bisher aber nicht hinbekommen. Muss aber nicth bedeuten, dass es keine Lösung gibt.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Genau das war die Überlegung. Da das Ganze auch auf MySQL 3.x laufen soll, such ich jetzt nach einer gemeinsamen Lösung. "Echte" Subselects scheiden da aus. Aber wie sieht es aus mit SelfJoins? Ich habe das bisher aber nicht hinbekommen. Muss aber nicth bedeuten, dass es keine Lösung gibt.
ob die mysql version auch joins beim update kann, ist mir unbekannt.
ich denke es kommt darauf an, wie der sql server die zeilen selektiert, und den update durchführt. (also erst ergebnismenge bilden, dann update auf die ergebnismenge, oder pro ergebniszeile sofort update)
es könnte etwa so aussehen:
update tabelle t1 join tabelle t2 on t1.s = (t2.s +- 1)
set t1.s = t2.s
where t1.s = s1 and t2.s in not null
ungetestet !
Hi,
es könnte etwa so aussehen:
update tabelle t1 join tabelle t2 on t1.s = (t2.s +- 1)
set t1.s = t2.s
where t1.s = s1 and t2.s in not nullungetestet !
also ich wuerde mich mit so einem Code nicht ohne vorangehende ausfuehrliche Tests an die Oeffentlichkeit wenden. ;-)
Gruss,
Ludger
also ich wuerde mich mit so einem Code nicht ohne vorangehende ausfuehrliche Tests an die Oeffentlichkeit wenden. ;-)
sinn und zweck dieses forums ist nicht, anderen die arbeit abzunehmen und fertige lösungen zu liefern, sondern gedankenanstöße zu geben.
oftmals hat man ja einen 'klemmer', und ein tip hilft einem weiter mit einem anderen gedankengang.
nochmal das problem:
aus 2 verschieden sätzen einer tabelle sollen inhalte getauscht werden. dies soll mit einem aufruf des sql servers erledigt werden.
dies geht mit einem update ohne join, wenn beide werte existent sind, es also 2 zeilen gibt.
das weiterführende problem ist, das es keine 2. zeile gibt.
dies soll mit einem join behandelt werden.
ein join erweitert das resultset um weitere spalten einer anderen tabelle. daher ist dieser gedankenansatz völlig ok.
mit einem join auf dieselbe tabelle ist die spalte also 2 mal in der ergebniszeile.
durch abfrage von isnull in der bedingung wird nun nur dann ein ergebnis geliefert, wenn beide zeilen vorhanden sind.
wenn nun nur eine zeile als resultset per bedingung ausgewählt wird, hat man beide spalten (links und rechts) aus verschiedenen zeilen im zugriff. mit der entspechenden set zuweisung können dann die spalten gesetzt werden.
die andere möglichkeit ist, per bedingung 2 zeilen im ergebnis auszuwählen, wobei die erste zeile die spalten in der folge links und rechts hat, und die zweite zeile die spalten umgekehrt, also rechts und links liefert. hier kann dann ebenfalls mit set ein anderer wert zugewwiesen werden.
Hello fk,
sinn und zweck dieses forums ist nicht, anderen die arbeit abzunehmen und fertige lösungen zu liefern, sondern gedankenanstöße zu geben.
So sehe ich das auch. Auch wenn ich manchmal (nach einigem Dialog) fast ferige Teillösungen poste. Da ich mit meinen dicken Wurstfingern aber immer Vertipper erzeuge, muss derjenige sowieso nochmals debuggen.
Deinen Denkansatz mit dem Join werde ich auf jeden Fall verfolgen. Ich habe es jetzt zwischenzeitlich mit zwei Statements gelöst, was ja bekanntermaßen das Problem mit sich bringt, dass man die durch WriteLock binden muss.
Zwei Statements ergeben in Wirklichkeit also vier Statements.
Lock
Statement 1
Statement 2
Unlock
Auch wenn man das Unlock dem Script-Exit überlässt (was hässlich ist), ist es immer noch vorhanden.
In jedem Statement können Fehler auftreten, die man abfangen muss. Das bedeutet also, dass sich der Aufwand von _einem_ (atomaren) Statement zu zwei zu bindeneden Statements typisch versechzehnfacht. Man sollte also auf jeden Fall versuchen, die Lösung mittels _EINES_ intelligenten SQL-Statements zu finden.
Da Ludger hier aber noch nicht einmal die Aufgabenstellung (tauschen von Datensätzen in einer Sortierung) verstanden hat, werden wir ihn mit den Betrachtungen zu N über K auf jeden Fall überfordern ;-) (bitte nicht böse sein Ludger)
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
Da Ludger hier aber noch nicht einmal die Aufgabenstellung (tauschen von Datensätzen in einer Sortierung) verstanden hat, werden wir ihn mit den Betrachtungen zu N über K auf jeden Fall überfordern ;-) (bitte nicht böse sein Ludger)
doch Ludger hat schon die Aufgabenstellung verstanden. Zudem hat Ludger auch verstanden, dass hier einer der nicht seltenen Faelle gegeben ist, dass das Verstehen der Anforderung (scheinbar willkuehrliche Sortierung unterstuetzen) fast automatisch zur Loesung fuehrt, denn - so seine durchgehende These - die angeforderte Sortierung ist ja nicht willkuehrlich und somit kann man die Regelmenge, die die Sortierung bestimmt, einfach, ganz einfach in die SORT BY-Klausel packen.
Und wenn Du ENDLICH einmal schreiben wuerdest, warum Du die Sortierung benoetigst, dann koennte Dir auch vermutlich geholfen werden.
Du blendest bestimmte Aspekte Deiner Anforderung aus und reduzierst auf eine Sortierungsverwaltung mithilfe eines Datenfelds. Und sowas macht man eben normalerweise nicht. (Du hattest ja schon die Frage aufgeworfen was zu tun ist, wenn Datensaetze "in die Mitte" eingefuegt werden sollen, dass dann der gesamte index reorganisert werden muss oder ein Fuellfaktor verwendet werden muss. Tendiert alles stark dazu Murks zu werden.)
Gruss,
Ludger
Hello,
Und wenn Du ENDLICH einmal schreiben wuerdest, warum Du die Sortierung benoetigst, dann koennte Dir auch vermutlich geholfen werden.
Das habe ich schon mehrfach beschrieben. Die Applikation erfordert das Anzeigen und Auswerten von Datensätzen in einer bestimmten Reihenfolge. Diese Reihenfolge wird durch den Benutzer der Applikation willkürlich festgelegt und nachträglcib frei verändert.
Warum das der Kunde so fordert, geht weder mich noch Dich etwas an.
Allerdings sei hier bemerkt, dass z.B. jede Angebots-Software dieses Feature verlangt und auch jedes frei konfigurierbare CMS seine Elemente frei sortierbar macht.
Es gibt für die Lösung entweder vergekktete Listen, was das Halten der Daten im Speicher oder rekursive Datenbank-Queries erforderlich macht. Oder es gibt die Möglichkeit der Schlüsselung.
Es ging hier nicht um "wie sortiere ich und warum" sondern es ging um "wie ändere ich die Sortierung möglichst mittels EINES Statements"
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hi,
Das habe ich schon mehrfach beschrieben. Die Applikation erfordert das Anzeigen und Auswerten von Datensätzen in einer bestimmten Reihenfolge. Diese Reihenfolge wird durch den Benutzer der Applikation willkürlich festgelegt und nachträglcib frei verändert.
danke!
Warum das der Kunde so fordert, geht weder mich noch Dich etwas an.
Doch, man muss den Kunden auch vor sich selbst schuetzen. Eine der Grundregeln unseres Gewerbes. Auch wenn nur bei guten Abnehmern empfehlenswert.
Es gibt für die Lösung entweder vergekktete Listen, was das Halten der Daten im Speicher oder rekursive Datenbank-Queries erforderlich macht. Oder es gibt die Möglichkeit der Schlüsselung.
An verkettete Listen habe ich bisher gar nicht gedacht. Die Indizierung finde ich jedenfalls weiterhin ausserordentlich unsexy.
Es ging hier nicht um "wie sortiere ich und warum" sondern es ging um "wie ändere ich die Sortierung möglichst mittels EINES Statements"
Dann bitte ich meine Insistieren zu entschuldigen...
Gruss,
Ludger