Konditionaler Rüeckgabewert und Subquery mit mehreren Werten in UPDATE-Statement?
am 02.07.2007 13:46:49 von Holger PollmannHallo,
ich stehe gerade etwas auf dem Schlauch, vielleicht kann mir jemand
helfen... (Datenbank: MySQL 5.0.30)
Zweierlei Dinge... erst einmal folgendes:
Gegeben sei eine Tabelle T1 mit vier Spalten item_id, datum, typ und
user_id.
Ich möchte jetzt gerne folgendes Statement ausführen:
SELECT
COUNT(DISTINCT item_id) AS a, MIN(datum) AS b
FROM T1
WHERE typ=$typ AND
user_id=$user_id AND
datum > $datum
GROUP BY user_id
Das klappt auch eigentlich ganz wunderbar - außer für die Fälle, wo es in
T1 keinen einzigen Eintrag gibt, in dem user_id = $user_id ist. Dann gibt
es nämlich kein Ergebnis zurück
Für diesen Fall hätte ich gerne, daß als a der Wert 0 zurückgeliefert
wird und als b NOW().
(Warum ich auf jeden Fall genau eine Zeile zurück haben möchte, ergibt
sich aus dem Folgenden.)
Nun die zweite Sache.
Gegeben sei eine Tabelle T2 mit (ua.) drei Spalten; einmal ein INT
user_id (als PRIMARY KEY), dann zwei INT-Spalten a und b.
Ich möchte jetzt gerne ein Update-Stament in dieser Art machen:
UPDATE T2 SET a=x, b=y WHERE user_id=$user_id
Allerdings sollen x und y dabei nicht von mir fest vorgegeben sein,
sondern aus dem Subquery kommen, den ich oben angesprochen habe. Der gibt
ja eine Zeile mit genau zwei Werten zurück. Wenn es nur ein Wert wäre, um
den es ginge, könnte ich ja problemlos sowas wie
SET a=(SELECT ..)
machen, aber ich habe zwei Werte, möchte aber sinnigerweise den Subquery
nicht zweimal ausführen lassen.
Wie kriege ich das hin?
Zusatzfrage: das ganze dient offensichtlich dazu, in der Taelle T2 einige
Werte als Ergebnis eines Subquerys für einen ganz bestimmten User zu
aktualisieren, was in der Regel ausreicht. Manchmal möchte ich aber auch
für alle vorhandenen User diese Aktualisierung vornehmen und würde auch
das, wenn es geht, am liebsten mit genau einem MySQL-Statement machen.
Dafür müßte man zum einen den Subquery so ändern, daß er, wenn ich das
richtig sehe, einen Join mit T2 macht, wobei für jede user_id aus T2, die
in T1 nicht auftaucht, eben die Default-Werte eingetragen werden; und
dann müßte das Update-Statement vermutlich einfach von dem "user_id=
$user_id" befreit werden.
Nur: wie macht man dann den Subquery?
--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Sie tragen Trauer? Der Untergang der DDR?" - "Nein, Leni Riefenstahl.
Der Führer hat sie zu sich genommen." -- Abschiedsshow Scheibenwischer,
02.10.2003