Konditionaler Rüeckgabewert und Subquery mit mehreren Werten in UPDATE-Statement?

Konditionaler Rüeckgabewert und Subquery mit mehreren Werten in UPDATE-Statement?

am 02.07.2007 13:46:49 von Holger Pollmann

Hallo,

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

Re: Konditionaler Rüeckgabewertund Subquery mit mehreren Werten in UPDATE-Statement?

am 02.07.2007 16:03:57 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Konditionaler Rüeckgabewertund Subquery mit mehreren Werten in UPDATE-Statement?

am 02.07.2007 22:34:56 von Holger Pollmann

Andreas Kretschmer schrieb:

> test=*# select coalesce(count(distinct item_id),0) as a,
> coalesce(min(datum),current_date) as b from t1 where typ=1 and
> user_id=1 and datum > '2007-06-01'::date ;
> a | b
> ---+------------
> 1 | 2007-07-01
> (1 row)
>
>
> Das ist, wie immer bei mir, PostgreSQL. Ob MySQL coalesce kann, hab
> ich nicht geprüft.

MySQL kann. Und erst habe ich es nicht gerafft, bis ich gemerkt habe,
was dein "Trick" war (neben COALESCE, an das ich hier nie gedacht
hätte): du hast den "GROUP BY"-Clause weggelassen. Dann geht's. Danke!

>> Nun die zweite Sache.
>>
>> [...]
>
> für die genannte t1 etwa so:
>
> update t1 set typ=foo.typ, user_id=foo.user_id from (select 2 as
> typ, 2 as user_id) foo where item_id=1;
>
> reicht das als Anregung?

Tatsächlich ging das völlig schief; MySQL scheint keine Statements der
Form
UPDATE ... SET .. FROM
zu mögen.

Auf einmal aber kam mir die Erleuchtung:

UPDATE
T1,
( - subquery - ) AS T2
SET T1.a=T2.a, T1.b=T2.b
WHERE T1.user_id=2

Danke!

jetzt muß ich mal schauen, ob ich meine "Zusatzfrage" auch noch in den
Griff bekomme.

--
( ROT-13 if you want to email me directly: uvuc@ervzjrexre.qr )
"Das saarl. VwVfG läßt eine Interpretation deutscher Gesetze nur dann
zu, wenn sie nicht eindeutig sind." Manfred Saar, Präsident
Apothekerkammer d. Saarlandes. heute-journal v. 8. August 2006.