Query über4 Tabellen?

Query über4 Tabellen?

am 03.01.2008 19:57:48 von Michael Kuroll

Hallo dcdm!

Ich brüte wieder einmal an einem Query:
Diese Joins haben sich mir leider noch immer nicht komplett erschlossen.

Serverversion: 5.0.32 (Debian)

Folgende Ausgangssituation:

4 Tabellen:
- cgplayer
Felder: cgplayer_userid, cgplayer_einsatz, cgplayer_gewinn

- gameplayer
Felder: gameplayer_userid, gameplayer_einsatz, gameplayer_gewinn

- turnieregameplayer
Felder: turnieregameplayer_userid, turnieregameplayer_einsatz

- turniere_gewinne
Felder: turnieregewinne_userid, turnieregewinne_gewinn

Irrelevante Felder habe ich hier übersichtshalber nicht erwähnt!
Alle Userid Felder sind natürlich int, die jeweiligen Einsatz und
Gewinnfelder decimal.

Ziel ist es eine Gesamt Gewinn/Verlust Liste für alle User (das jeweilige
userid Feld).

D.h. ich brauche eine Summe von:
cgplayer_gewinn - cgplayer_einsatz + gameplayer_gewinn - gameplayer_einsatz
+ turnieregewinne_gewinn - turnieregameplayer_einsatz

und das über die jeweiligen userid Felder verknüpft.

Gibt es hier Möglichkeiten oder ist es sinnvoller die jeweiligen Werte
mittels einem eigenen Query abzufragen und dann softwaretechnisch zu
summieren?

Vielen Dank für Eure Mühen
lg
Mike

Re: Query über 4 Tabellen?

am 03.01.2008 22:24:23 von Claus Reibenstein

Michael Kuroll schrieb:

> Ich brüte wieder einmal an einem Query:
> Diese Joins haben sich mir leider noch immer nicht komplett erschlossen.

Schaumermal.

> 4 Tabellen:
> - cgplayer
> Felder: cgplayer_userid, cgplayer_einsatz, cgplayer_gewinn
>
> - gameplayer
> Felder: gameplayer_userid, gameplayer_einsatz, gameplayer_gewinn
>
> - turnieregameplayer
> Felder: turnieregameplayer_userid, turnieregameplayer_einsatz
>
> - turniere_gewinne
> Felder: turnieregewinne_userid, turnieregewinne_gewinn

Welchen Sinn und Zweck soll es haben, den Tabellennamen in jede
Spaltenbezeichnung mit einzubeziehen? Warum heißen z.B. die Spalten in
cgplayer nicht einfach userid, einsatz und gewinn? Das würde Dir in
Deinen Queries viel Tipparbeit ersparen.

> Ziel ist es eine Gesamt Gewinn/Verlust Liste für alle User (das jeweilige
> userid Feld).

Gibt es denn eine Tabelle mit den User-Informationen? Also eine, die
alle User-IDs enthält? In Deiner Aufstellung fehlt eine solche, was die
gewünschte Abfrage praktisch unmöglich macht.

Ich nehme einfach mal eine weitere Tabelle an:
Tabelle: userdaten
Felder: userid, name, vorname, ...

Kann es ferner sein, dass ein User in einer Tabelle mehrfach oder auch
gar nicht vorkommt? Auch das verkompliziert die Abfrage.



>
> D.h. ich brauche eine Summe von:
> cgplayer_gewinn - cgplayer_einsatz + gameplayer_gewinn - gameplayer_einsatz
> + turnieregewinne_gewinn - turnieregameplayer_einsatz
>
> und das über die jeweiligen userid Felder verknüpft.

Dann schreibe das doch erst einfach mal hin (ich beschränke mich mal auf
cgplayer und gameplayer):

SELECT userid, sum(cgplayer_gewinn) - sum(cgplayer_einsatz)
+ sum(gameplayer_gewinn) - sum(gameplayer_einsatz)
FROM userdaten, cgplayer, gameplayer
WHERE userid = cgplayer_userid AND userid = gameplayer_userid
GROUP BY userid;

Diese Abfrage berücksichtigt schon den Fall, dass eine User-ID in einer
Tabelle mehrfach vorkommen kann, aber noch nicht, dass eine User-ID
möglicherweise gar nicht auftaucht.

Gruß. Claus

Re: Query über 4 Tabellen?

am 04.01.2008 00:10:16 von Michael Kuroll

Am Thu, 03 Jan 2008 22:24:23 +0100 schrieb Claus Reibenstein:

Hallo Claus!
Vielen Dank für Deine Antwort.

>> 4 Tabellen:
>> - cgplayer
>> Felder: cgplayer_userid, cgplayer_einsatz, cgplayer_gewinn

>> - gameplayer
>> Felder: gameplayer_userid, gameplayer_einsatz, gameplayer_gewinn

>> - turnieregameplayer
>> Felder: turnieregameplayer_userid, turnieregameplayer_einsatz

>> - turniere_gewinne
>> Felder: turnieregewinne_userid, turnieregewinne_gewinn

> Welchen Sinn und Zweck soll es haben, den Tabellennamen in jede
> Spaltenbezeichnung mit einzubeziehen? Warum heißen z.B. die Spalten in
> cgplayer nicht einfach userid, einsatz und gewinn? Das würde Dir in
> Deinen Queries viel Tipparbeit ersparen.

Ich hab mir das angewohnt, weil es für mich übersichtlicher ist.
Mehr Tipparbeit ist es definitiv, aber das nehm ich in dem Fall gern in
Kauf.

>> Ziel ist es eine Gesamt Gewinn/Verlust Liste für alle User (das jeweilige
>> userid Feld).

> Gibt es denn eine Tabelle mit den User-Informationen? Also eine, die
> alle User-IDs enthält? In Deiner Aufstellung fehlt eine solche, was die
> gewünschte Abfrage praktisch unmöglich macht.

> Ich nehme einfach mal eine weitere Tabelle an:
> Tabelle: userdaten
> Felder: userid, name, vorname, ...

Yep, selbstverständlich.

- Tabelle user
Felder: user_userid, user_vorname, user_nachname,...

> Kann es ferner sein, dass ein User in einer Tabelle mehrfach oder auch
> gar nicht vorkommt? Auch das verkompliziert die Abfrage.

Beides kann vorkommen.
ich dachte an sum() (wenn eine userid nicht vorkommt dann sollte sum() so
oder so 0 ergeben - oder überseh ich da was?

>> D.h. ich brauche eine Summe von:
>> cgplayer_gewinn - cgplayer_einsatz + gameplayer_gewinn - gameplayer_einsatz
>> + turnieregewinne_gewinn - turnieregameplayer_einsatz
>> und das über die jeweiligen userid Felder verknüpft.

> Dann schreibe das doch erst einfach mal hin (ich beschränke mich mal auf
> cgplayer und gameplayer):
>
> SELECT userid, sum(cgplayer_gewinn) - sum(cgplayer_einsatz)
> + sum(gameplayer_gewinn) - sum(gameplayer_einsatz)
> FROM userdaten, cgplayer, gameplayer
> WHERE userid = cgplayer_userid AND userid = gameplayer_userid
> GROUP BY userid;

Etwas ähnliches hatte ich schon, allerdings stimmt das Ergebnis absolut
nicht. Ich erhalte absolut utopische Werte wie zB. -33664 oder 181816.
Das richtige Ergebnis (händisch nachgerechnet) sollte aber dreistellig
sein.

> Diese Abfrage berücksichtigt schon den Fall, dass eine User-ID in einer
> Tabelle mehrfach vorkommen kann, aber noch nicht, dass eine User-ID
> möglicherweise gar nicht auftaucht.

Ich versteh noch immer nicht, was passieren sollte wenn in einer der
Tabellen eine Userid nicht vorhanden ist?

Vielen Dank nochmals für Deine Zeit und Mühen.
Mike

Re: Query über 4 Tabellen?

am 04.01.2008 00:18:49 von Michael Kuroll

Am Fri, 4 Jan 2008 00:10:16 +0100 schrieb Michael Kuroll:

> Yep, selbstverständlich.

> - Tabelle user
> Felder: user_userid, user_vorname, user_nachname,...

Sorry, das sollte user_id anstatt user_userid heißen.

Re: Query über4 Tabellen?

am 04.01.2008 01:33:00 von B.Steinbrink

On Fri, 04 Jan 2008 00:10:16 +0100, Michael Kuroll wrote:

> Am Thu, 03 Jan 2008 22:24:23 +0100 schrieb Claus Reibenstein:

>> Diese Abfrage berücksichtigt schon den Fall, dass eine User-ID in einer
>> Tabelle mehrfach vorkommen kann, aber noch nicht, dass eine User-ID
>> möglicherweise gar nicht auftaucht.
>
> Ich versteh noch immer nicht, was passieren sollte wenn in einer der
> Tabellen eine Userid nicht vorhanden ist?

mysql> create table a(id int);
Query OK, 0 rows affected (0.02 sec)

mysql> create table b(id int);
Query OK, 0 rows affected (0.06 sec)

mysql> insert into a values (1),(2);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

mysql> insert into b values (1);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM a INNER JOIN b USING (id);
+------+
| id |
+------+
| 1 |
+------+
1 row in set (0.00 sec)

Für den Wert 2 in Tabelle a wurde in Tabelle b nix passendes gefunden,
also fliegt für nen INNER JOIN die 2 komplett raus. Da muss man dann mit
LEFT JOINs zur Sache gehen. Und weil eine der Summen dann NULL sein
könnte, musst du dann wahrscheinlich auch noch mit COALESCE arbeiten.

Björn