joiner: Multiupdates MySql >= 5.0.12

Beitrag lesen

echo $begrüßung;

echo begruessung();

UPDATE tmpDst as d
CROSS JOIN tmpSrc as s
    ON s.PId = d.Id
   SET d.Txt = CONCAT( d.Txt, s.Str )
WHERE 1;

Seit MySql 5.0.12 verweist MySql in einem Nebensatz Ihrer Ref. nun darauf, dass das nicht sql2003 konform ist und die entsprechenden Abfragen umgeschrieben werden müssen.

Schon wäre es gewesen, wenn du die Stelle verlinkt hättest, denn so habe ich diese Aussage nicht finden können. Und da meist recht viel Text auf einer Handbuchseite steht, empfiehlt es sich zumindest den Anfang des betreffenden Satzes zu zitieren.

sorry: http://dev.mysql.com/doc/refman/5.1/de/join.html
strgf, "5.0.12", in der Mitte etwa

Stattdessen fand ich die Aussage, dass in einem Multiple-Table-Update kein ORDER BY verwendet werden kann[1] und die Reihenfolge der Zuweisungen somit beliebig sein kann[2]. Du bekämst also mit deinem Statement unvorhersagbare Ergebnisse.

http://dev.mysql.com/doc/refman/5.0/en/update.html:
[1] "... you cannot use ORDER BY or LIMIT with a multiple-table UPDATE."
[2] "For multiple-table updates, there is no guarantee that assignments are carried out in any particular order."[3]
[3] Es kann sein, dass ich diesen Satz missverstanden habe, und er nicht auf diese Situation anwendbar ist.

Die Reihenfolge ist Irrelevant. Viel Schlimmer noch ist, dass das auch bei Berechnungnen schiefgeht ( also zb. a.xx = a.xx + b.yy ). Hier ist die Reihenfolge bei einer Summe sowieso egal.

Hat da schon Jemand eine Lösung?

GROUP_CONCAT() zusammen mit einem Subselect kann helfen.

UPDATE tmpDst as d
CROSS JOIN
  (SELECT PId, GROUP_CONCAT(Str ORDER BY Nr SEPARATOR '') gc FROM tmpSrc GROUP BY PId) as s
ON s.PId = d.Id
SET d.Txt = s.gc;

Schon getestet ..
GROUP_CONCAT funktioniert nur bei relativ kurzen Strings zuverlässig, danach fehlt die Hälfte, warum auch immer

Das brachte mir zumindest das gewünschte Ergebnis.

Die Frage ist auch, was machen bei komplizierteren Updates ( Berechnungen über die entsprechenden Spalten ) wenn der immer nur eine von der 2. Tabelle verwendet (Reihenfolge hab ich auch schon geändert).

echo "$verabschiedung $name";

veranschiedung($actUser["Name"]);