2 sql Abfragen kombinieren
viking
- datenbank
0 Matze0 MudGuard0 misterunknown0 MudGuard0 misterunknown0 viking0 misterunknown0 viking0 misterunknown
Servus, hoffe jemand kann mir auf die Sprünge helfen. Ich hab 2 SQL Abfragen die einzeln wunderbar funktionieren. Nun möchte ich diese so kombinieren, dass sie in der selben Tabelle ausgegeben werden.
SELECT projectteam_id, SUM( value*2 ) AS 2er
FROM jos_joomleague_match_statistic
WHERE statistic_id =3
GROUP BY projectteam_id
LIMIT 0 , 30
SELECT projectteam_id, SUM( value*5 ) AS 5er
FROM jos_joomleague_match_statistic
WHERE statistic_id =4
GROUP BY projectteam_id
LIMIT 0 , 30
Kann jemand behilflich sein? Das Resultat sollte zum Beispiel so sein:
projectteam_id | 2er | 5er
1 | 50 | 12
2 | 18 | 28
3
..
Gruss & Danke
Jan
Hallo!
SELECT projectteam_id, SUM( value*2 ) AS 2er, SUM( value*5 ) AS 5er
FROM jos_joomleague_match_statistic
WHERE statistic_id =3
GROUP BY projectteam_id
LIMIT 0 , 30
Grüße, Matze
Hi,
SELECT projectteam_id, SUM( value*2 ) AS 2er
FROM jos_joomleague_match_statistic
WHERE statistic_id =3
GROUP BY projectteam_id
LIMIT 0 , 30
>
> ~~~sql
SELECT projectteam_id, SUM( value*5 ) AS 5er
> FROM jos_joomleague_match_statistic
> WHERE statistic_id =4
> GROUP BY projectteam_id
> LIMIT 0 , 30
Kann jemand behilflich sein? Das Resultat sollte zum Beispiel so sein:
projectteam_id | 2er | 5er
1 | 50 | 12
2 | 18 | 28
3
Ne, so sollte das Resultat auf keinen Fall aussehen, denn SUM( value*5 ) AS 5er kann nur Werte ergeben, die durch 5 teilbar sind ... ;-)
Das WHERE muß natürlich aufgebohrt werden, damit sowoh 3 als auch 4 erlaubt ist, also IN (3, 4).
Damit für die 2er nur die passenden Werte (statistic_id = 3) gezählt werden, sollte der value noch mit 1 (falls statistic_id = 3) bzw. 0 (fallst statistic_id nicht 3) multipliziert werden.
Die meisten DB-Systeme kennen eine IF-Funktion oder ähnliches. Du verrätst ja nicht, welches Du benutzt.
Also in etwa so:
SUM( value*5*IF(statisitic_id=3;1;0) ) AS 2er
Genaue Syntax für IF verrät Dir das Handbuch Deines DB-Systems.
Für die 5er analog, mit statistic_id = 4, als zusätzliche Spalte beim select.
Ob Du das LIMIT (ok, Oracle benutzt Du nicht ...) auf 60 erhöhen willst, mußt Du selbst wissen.
(übrigens: mir kommt das LIMIT ohne ORDER BY verdächtig vor ...)
cu,
Andreas
Ne, so sollte das Resultat auf keinen Fall aussehen, denn SUM( value*5 ) AS 5er kann nur Werte ergeben, die durch 5 teilbar sind ... ;-)
Stimmt ;)
Das WHERE muß natürlich aufgebohrt werden, damit sowoh 3 als auch 4 erlaubt ist, also IN (3, 4).
Damit für die 2er nur die passenden Werte (statistic_id = 3) gezählt werden, sollte der value noch mit 1 (falls statistic_id = 3) bzw. 0 (fallst statistic_id nicht 3) multipliziert werden.
Die meisten DB-Systeme kennen eine IF-Funktion oder ähnliches. Du verrätst ja nicht, welches Du benutzt.Also in etwa so:
SUM( value*5*IF(statisitic_id=3;1;0) ) AS 2er
Genaue Syntax für IF verrät Dir das Handbuch Deines DB-Systems.
Für die 5er analog, mit statistic_id = 4, als zusätzliche Spalte beim select.
Ob Du das LIMIT (ok, Oracle benutzt Du nicht ...) auf 60 erhöhen willst, mußt Du selbst wissen.
Habs nun so versucht:
SELECT projectteam_id, SUM( value*2*IF(statistic_id=3,1,0) ) AS 2er, SUM( value*5*IF(statistic_id=4,1,0) ) AS 5er
FROM jos_joomleague_match_statistic
WHERE statistic_id =(3,4)
GROUP BY projectteam_id
Bekomme nun aber folgenden Fehler:#1241 - Operand should contain 1 column(s)
Was hat es damit auf sich?
Gruss Jan
SELECT projectteam_id, SUM( value *2 * IF( statistic_id =3, 1, 0 ) ) AS 2er , SUM( value *5 * IF( statistic_id =4, 1, 0 ) ) AS 5er , SUM( value *10 * IF( statistic_id =7, 1, 0 ) ) AS 10er , SUM( value *20 * IF( statistic_id =8, 1, 0 ) ) AS 20er , SUM( value *25 * IF( statistic_id =9, 1, 0 ) ) AS 5er
FROM jos_joomleague_match_statistic
GROUP BY projectteam_id
Geschafft, Danke fürs auf den richtigen Weg führen!
Hi,
Geschafft, Danke fürs auf den richtigen Weg führen!
Gut! Und auch Dir ein Danke, daß Du die fertige Lösung auch präsentierst - das hilft dann späteren Archiv-Suchern.
cu,
Andreas
Hi,
Das WHERE muß natürlich aufgebohrt werden, damit sowoh 3 als auch 4 erlaubt ist, also IN (3, 4).
WHERE statistic_id =(3,4)
Da ist was falsch, hab doch extra das IN hingeschrieben ...
cu,
Andreas
Moin,
SELECT
A.projectteam_id
, SUM( A.value*2 ) AS 2er
, SUM( B.value*5 ) AS 5er
FROM jos_joomleague_match_statistic AS A
JOIN jos_joomleague_match_statistic AS B ON
B.projectteam_id = A.projectteam_id
AND B.statistic_id = 4
WHERE statistic_id = 3
GROUP BY projectteam_id
LIMIT 0 , 30
(ungetestet)
Grüße Marco
Hi,
SELECT
A.projectteam_id
, SUM( A.value2 ) AS 2er
, SUM( B.value5 ) AS 5er
FROM jos_joomleague_match_statistic AS A
JOIN jos_joomleague_match_statistic AS B ON
B.projectteam_id = A.projectteam_id
AND B.statistic_id = 4
WHERE statistic_id = 3
GROUP BY projectteam_id
LIMIT 0 , 30
Wenn ich das richtig sehe, werden dann projectteams, für die es keine Zeile mit statistic\_id=3 gibt (sondern nur eine mit statistic\_id=4), gar nicht berücksichtigt.
(im WHERE/GROUP BY müßte m.E. auch noch der jeweilige Tabellen-Alias mit dazu.)
cu,
Andreas
--
[Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)
[O o ostern ...](http://ostereier.andreas-waechter.de/)
Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
Moin,
Wenn ich das richtig sehe, werden dann projectteams, für die es keine Zeile mit statistic_id=3 gibt (sondern nur eine mit statistic_id=4), gar nicht berücksichtigt.
(im WHERE/GROUP BY müßte m.E. auch noch der jeweilige Tabellen-Alias mit dazu.)
Stimmt. Man könnte die eigentliche Abfrage nur auf die Projektteams einschränken und mit 2 Joins (jeweils für id 3 und 4) arbeiten. Die Aliases in WHERE/GROUP BY hatte ich schlicht vergessen. In so einer 2-Join-Variante könnte man sich durch DISTINCT
auch das GROUP BY
sparen.
SELECT
DISTINCT Basis.projectteam_id
, SUM( A.value*2 ) AS 2er
, SUM( B.value*5 ) AS 5er
FROM jos_joomleague_match_statistic AS Basis
LEFT JOIN jos_joomleague_match_statistic AS A ON
A.projectteam_id = Basis.projectteam_id
AND A.statistic_id = 3
LEFT JOIN jos_joomleague_match_statistic AS B ON
B.projectteam_id = Basis.projectteam_id
AND B.statistic_id = 4
LIMIT 0 , 30
(auch ungetestet)
Grüße Marco
Stimmt. Man könnte die eigentliche Abfrage nur auf die Projektteams einschränken und mit 2 Joins (jeweils für id 3 und 4) arbeiten. Die Aliases in WHERE/GROUP BY hatte ich schlicht vergessen. In so einer 2-Join-Variante könnte man sich durch
DISTINCT
auch dasGROUP BY
sparen.
SELECT
DISTINCT Basis.projectteam_id
, SUM( A.value2 ) AS 2er
, SUM( B.value5 ) AS 5er
FROM jos_joomleague_match_statistic AS Basis
LEFT JOIN jos_joomleague_match_statistic AS A ON
A.projectteam_id = Basis.projectteam_id
AND A.statistic_id = 3
LEFT JOIN jos_joomleague_match_statistic AS B ON
B.projectteam_id = Basis.projectteam_id
AND B.statistic_id = 4
LIMIT 0 , 30
> (auch ungetestet)
>
> Grüße Marco
Wow erstmal danke für die Hilfe, das übersteigt meine Kenntnisse. Wo genau hast du nun definiert, dass nur projectteam\_id 2 abgefragt wird? Hab's kurz ausprobiert erhalte aber (wohl) noch nicht das gewünschte. AUsgegeben wird nun folgendes:
projectteam\_id | 2er | 5er|
2 | 230364 |NULL|
Die NULL stimmt, da beim Team 2 keine Werte mit statistic\_id = 4 existieren. Der Wert für 2er also statistic\_id = 3 ist allerdings viel zu hoch. Da dürften nur 106 stehen.
Moin,
Wow erstmal danke für die Hilfe, das übersteigt meine Kenntnisse. Wo genau hast du nun definiert, dass nur projectteam_id 2 abgefragt wird?
Gar nicht. Das hast du aber auch nicht, wenn ich nicht total blind bin. Kann man aber natürlich noch einfügen.
Hab's kurz ausprobiert erhalte aber (wohl) noch nicht das gewünschte. AUsgegeben wird nun folgendes:
projectteam_id | 2er | 5er|
2 | 230364 |NULL|
Die NULL stimmt, da beim Team 2 keine Werte mit statistic_id = 4 existieren. Der Wert für 2er also statistic_id = 3 ist allerdings viel zu hoch. Da dürften nur 106 stehen.
Hm. Das kann verschiedene Gründe haben. Du kannst zum Debuggen mal die Summe und das DISTINCT weglassen und so sehen, welche Datensätze er dort heranzieht. Außerdem hielt ich auch die Multiplikation mit 2 innerhalb der Summe für komisch. Welche Bedeutung hat das genau?
Grüße Marco
Moin,
Wow erstmal danke für die Hilfe, das übersteigt meine Kenntnisse. Wo genau hast du nun definiert, dass nur projectteam_id 2 abgefragt wird?
Gar nicht. Das hast du aber auch nicht, wenn ich nicht total blind bin. Kann man aber natürlich noch einfügen.
Nein hatte ich nicht und will ich eigentlich auch nicht, aber jetzt wird mir nur noch diese Zeile angezeigt, daher dachte ich zuerst daran.
Hab's kurz ausprobiert erhalte aber (wohl) noch nicht das gewünschte. AUsgegeben wird nun folgendes:
projectteam_id | 2er | 5er|
2 | 230364 |NULL|
Die NULL stimmt, da beim Team 2 keine Werte mit statistic_id = 4 existieren. Der Wert für 2er also statistic_id = 3 ist allerdings viel zu hoch. Da dürften nur 106 stehen.Hm. Das kann verschiedene Gründe haben. Du kannst zum Debuggen mal die Summe und das DISTINCT weglassen und so sehen, welche Datensätze er dort heranzieht. Außerdem hielt ich auch die Multiplikation mit 2 innerhalb der Summe für komisch. Welche Bedeutung hat das genau?
Es handelt sich hierbei um die Statistik der Strafminuten. Statistic_id=3 sind die Zweiminutenstrafen, daher multiplizier ich die Anzahl mit 2 um auf die totale Anzahl Strafminuten zu kommen, statistic_id=4 sind Fünfminutenstrafen etc...
Hab mal die Summe weggelassen, dabei seh ich dass mehrfache Werte nur einmal pro Team rausgezogen werden, was zwar auch nicht gewollt ist, das Rätsel um die Riesenzahl aber noch nicht löst.
Gruss Jan
Moin,
Nein hatte ich nicht und will ich eigentlich auch nicht, aber jetzt wird mir nur noch diese Zeile angezeigt, daher dachte ich zuerst daran.
Achso. Das ist komisch.
Es handelt sich hierbei um die Statistik der Strafminuten. Statistic_id=3 sind die Zweiminutenstrafen, daher multiplizier ich die Anzahl mit 2 um auf die totale Anzahl Strafminuten zu kommen, statistic_id=4 sind Fünfminutenstrafen etc...
Aha. Das Ergibt natürlich Sinn.
Hab mal die Summe weggelassen, dabei seh ich dass mehrfache Werte nur einmal pro Team rausgezogen werden, was zwar auch nicht gewollt ist, das Rätsel um die Riesenzahl aber noch nicht löst.
Das ist sicherlich ein Distinct-Problem. Lass mal das Distinct-Schlüsselwort weg und nehme Basis.projectteam_id in die GROUP BY Klausel mit rein:
SELECT
Basis.projectteam_id
, SUM( A.value*2 ) AS 2er
, SUM( B.value*5 ) AS 5er
FROM jos_joomleague_match_statistic AS Basis
LEFT JOIN jos_joomleague_match_statistic AS A ON
A.projectteam_id = Basis.projectteam_id
AND A.statistic_id = 3
LEFT JOIN jos_joomleague_match_statistic AS B ON
B.projectteam_id = Basis.projectteam_id
AND B.statistic_id = 4
GROUP BY Basis.projectteam_id
LIMIT 0 , 30
Ansonsten könntest du auch mal versuchen das LIMIT wegzulassen.
Grüße Marco
Das ist sicherlich ein Distinct-Problem. Lass mal das Distinct-Schlüsselwort weg und nehme Basis.projectteam_id in die GROUP BY Klausel mit rein:
SELECT
Basis.projectteam_id
, SUM( A.value2 ) AS 2er
, SUM( B.value5 ) AS 5er
FROM jos_joomleague_match_statistic AS Basis
LEFT JOIN jos_joomleague_match_statistic AS A ON
A.projectteam_id = Basis.projectteam_id
AND A.statistic_id = 3
LEFT JOIN jos_joomleague_match_statistic AS B ON
B.projectteam_id = Basis.projectteam_id
AND B.statistic_id = 4
GROUP BY Basis.projectteam_id
LIMIT 0 , 30
> Ansonsten könntest du auch mal versuchen das LIMIT wegzulassen.
>
Dankeschön, jetzt sind wieder alle projectteams vorhanden! Was jetzt noch bleibt sind die viel zu grossen Werte die noch bestehen. Limit lass ich immer weg, aber phpmyadmin schreibts bei der Ausgabe jeweils wieder dazu und ich hatte die Ausgabe kopiert.
Hab mal die beiden AND Bedingungen weggelassen, nun bekomm ich Werte in Millionenhöhe was noch weniger Sinn macht. Kann es sein, dass es irgendwo an dieser Bedingung hängt?
Gruss Jan
Moin,
Hab mal die beiden AND Bedingungen weggelassen, nun bekomm ich Werte in Millionenhöhe was noch weniger Sinn macht. Kann es sein, dass es irgendwo an dieser Bedingung hängt?
Wie ist denn die Tabelle aufgebaut? Welche Felder gibt es noch? Und wie viele Datensätze sind insgesamt darin?
Grüße Marco