Summen mit left join

Hallo,

gegeben seien 3 Tabellen:

Warenkorb
wkid int ...

Artikelart1
artid
wkid int,
preis decimal (6,3)
...

Artikelart2
s.o.

Wenn ich nun ein left join mache:
SELECT SUM( a1.preis + a2.preis) FROM
Warenkorb wk
LEFT JOIN Artikelart1 a1 on a1.wkid=wk.wkid
LEFT JOIN Artikelart2 a2 on a2.wkid=wk.wkid

Dann erhalte ich natürlich eine leere Summe, wenn nur eine Artikelart im
Warenkorb ist, da die andere Summe ja NULL ist und wenn man irgendwas
ins schwarze Loch kippt, ist das ja nun mal weg;-)
Man kann ja nun ein if( a1.preis is null ,0,sum(a1.preis))... daraus
machen, aber geht so etwas noch eleganter?
Stefan Dreyer [ Do, 24 Januar 2008 15:55 ] [ ID #1915312 ]

Re: Summen mit left join

Stefan Dreyer schrieb:
> Hallo,
>
> gegeben seien 3 Tabellen:
>
> Warenkorb
> wkid int ...
>
> Artikelart1
> artid
> wkid int,
> preis decimal (6,3)
> ...
>
> Artikelart2
> s.o.

Also erstmal ist Dein Tabellendesign...suboptimal.

Spricht was dagegen, die Tabellen Artikelart1 und Artikelart2
zusammenzulegen und einzusätzliches Feld art hinzuzufügen, welches dann
1 oder 2 sein kann?

Aber egal.

[snip]

> Man kann ja nun ein if( a1.preis is null ,0,sum(a1.preis))... daraus
> machen, aber geht so etwas noch eleganter?

Klar. Mit coalesce (portabel) oder ifnull (mysql-spezifisch).

Also sum(coalesce(a1.preis,0)+coalesce(a2.preis,0)) sollte es tun
(ungetestet).


HTH,


Thomas
Thomas Rachel [ Do, 24 Januar 2008 20:47 ] [ ID #1915316 ]

Re: Summen mit left join

Thomas Rachel wrote:
> Stefan Dreyer schrieb:
>
>>Hallo,
>>
>>gegeben seien 3 Tabellen:
>>
>>Warenkorb
>> wkid int ...
>>
>>Artikelart1
>> artid
>> wkid int,
>> preis decimal (6,3)
>> ...
>>
>>Artikelart2
>> s.o.
>
>
> Also erstmal ist Dein Tabellendesign...suboptimal.
>
> Spricht was dagegen, die Tabellen Artikelart1 und Artikelart2
> zusammenzulegen und einzusätzliches Feld art hinzuzufügen, welches dann
> 1 oder 2 sein kann?
>
> Aber egal.

Es spricht dagegen, dass es wiederum für das Objektdesign, sowie für
andere Teile des Programmes suboptimal ist, die Tabellen
zusammenzulegen. Die Zahl der diskunkten Felder ist auch sehr groß,
da es sich um komplett andere Dinge dabei handelt, wo dann auch
ganz unterschiedliche Logiken dahinter stehen. Das, was ich dann
an dieser einen Stelle gewinnen würde, würde ich an anderer Stelle
um ein mehrfaches verlieren.
Aber ich habe genau gewusst, dass diese Anmerkung kommen wird.

>
> [snip]
>
>
>>Man kann ja nun ein if( a1.preis is null ,0,sum(a1.preis))... daraus
>>machen, aber geht so etwas noch eleganter?
>
>
> Klar. Mit coalesce (portabel) oder ifnull (mysql-spezifisch).
>
> Also sum(coalesce(a1.preis,0)+coalesce(a2.preis,0)) sollte es tun
> (ungetestet).

Werde ich mal ausprobieren.
Stefan Dreyer [ Fr, 25 Januar 2008 11:04 ] [ ID #1916137 ]

Re: Summen mit left join

Stefan Dreyer schrieb:

>> Spricht was dagegen, die Tabellen Artikelart1 und Artikelart2
>> zusammenzulegen und einzusätzliches Feld art hinzuzufügen, welches dann
>> 1 oder 2 sein kann?
>>
>> Aber egal.
>
> Es spricht dagegen, dass es wiederum für das Objektdesign, sowie für
> andere Teile des Programmes suboptimal ist, die Tabellen
> zusammenzulegen. Die Zahl der diskunkten Felder ist auch sehr groß,

Gut, dann paßt es ja.


> Aber ich habe genau gewusst, dass diese Anmerkung kommen wird.

Die Tabellen haben eben so ähnlich ausgesehen ...

Aber egal, war ja nur ne Anmerkung...


Thomas
Thomas Rachel [ Fr, 25 Januar 2008 14:06 ] [ ID #1916138 ]
Datenbanken » de.comp.datenbanken.mysql » Summen mit left join

Vorheriges Thema: heap table und log_slow_queries
Nächstes Thema: Anfängerfrage für Abfrage