11 messages in com.mysql.lists.mysql-deRe: UPDATE und SELECT verbinden?
FromSent OnAttachments
Bernd Tannenbaum27 Oct 2003 06:29 
Sebastian Tobias Mendel genannt Mendelsohn27 Oct 2003 06:55 
Felix Antonius Wilhelm Ostmann28 Oct 2003 01:13 
Bernd Tannenbaum29 Oct 2003 02:31 
Sebastian Tobias Mendel genannt Mendelsohn29 Oct 2003 04:14 
Bernd Tannenbaum03 Nov 2003 04:13 
Gerd Terlutter03 Nov 2003 04:24 
Bernd Tannenbaum03 Nov 2003 05:22 
Bernd Tannenbaum03 Nov 2003 06:59 
Rene Fertig03 Nov 2003 11:35 
Bernd Tannenbaum03 Nov 2003 22:35 
Subject:Re: UPDATE und SELECT verbinden?
From:Rene Fertig (re@renux.de)
Date:11/03/2003 11:35:00 AM
List:com.mysql.lists.mysql-de

Hallo Bernd.

Am Montag, 3. November 2003 14:22 schrieb Bernd Tannenbaum:

du kannst z. B. ein shell-script schreiben. Da ich PHP mache, kann ich solche Sachen über den Server/Browser ausführen: $sql = 'select ...'; $result = mysql_query( $sql ); ... foreach( $result as $row ) mysql_query( 'update table set ... where ...'); für ein shell-script würde ich Abfrage 1 in eine Datei umleiten. Alternativ wäre noch Perl zu erwähnen.

Ok, hört sich übel an. Hätte in meiner Naivität nicht gedacht, das so etwas vermeintlich einfaches wie die Suche nach einem Maximalwert so ausufert. Das würde ja zum einen bedeuten, das ich das Skript-System, in dem ich die SQL-Befehle aus einer Texdatei innerhalb des Shell-Skriptes nicht mehr an mysql übergeben kann und das ich bei 50 Abfragen dieser Art 50 Dateien zu verwalten hab.....arf.

Werde also wohl eher mysql updaten (versuchen zumindest), ist wohl das kleinere Übel.

Das kleinere Übel im Gegensatz zu der Shellscript-Mimik sicherlich.

Mal abgesehen davon, das ich dein Tabellenkonstrukt nicht wirklich verstehe, kennt MySQL auch temporäre Tabellen, die sich zum zwischenspeichern von Zwischenergebnissen (und nichts anderes sind Subselect) eignen. Somit lässt sich die nicht funktionierende Query UPDATE `table` SET `field1` = (SELECT MAX(`feld2`) FROM `table`) WHERE `id` = 1

in zwei Statments auflösen, die man dann direkt hintereinander abschickt:

CREATE TEMPORARY TABLE `zwischen` SELECT MAX(`feld2`) AS `max_fld2` FROM `table`;

REPLACE INTO `table` (`id`,`field1`) SELECT `max_fld2`, 1 AS `id` from `zwischen`;

Nachteil ist hier, dass das UPDATE durch ein REPLACE ersetzt werden muss. Dazu muss mindestens ein Feld der Tabelle einen Primary oder Unique-Key haben (ich denke, das ein Feld namens `id` einen Primary-Key hat). Außerdem müssen auch alle unveränderten Werte im Select-Bereich ausgegeben werden, sonst sind die nach dem REPLACE auf default gesetzt.

Aber wie gesagt, ich verstehe den Sinn dahinter nicht, warum du ein Feld eines Datensatzes aus der Tabelle mit dem Maximalwert eines anderen Feldes füllst. Ich würde da eine zweite Tabelle verwenden, oder den Wert eh immer aktuell ermitteln.

Vielleicht magst du uns ja auch erzählen, was du vorhast. Das würde dann helfen, die richtigen Tipps zu geben.

Falls du eine gute Einführung in MySQL wünschst, schau dir doch mal das "MySQL Datenbankhandbuch" von Guido Stepken unter http://www.rent-a-database.de/mysql/ an. Da sind viele Sachen recht gut erklärt, die man in der Offiziellen Doku zwar findet, aber erst wenn man weiß wonach man suchen muss :-) Ohne das Teil hätte ich das mit den left joins wohl heute noch nicht verstanden...

Ciao, René

----------------------------------------------------------------------