MYSQL Subselect mit Werten aus select?
baeckerman83
- datenbank
Hiho!
Ich versuche per Select abfrage einige Daten zusammen zufassen. Aber leider kann ich den Wert aus der ersten select abfrage im subselect nicht in der if Klausel benutzen. Ich möchte mir aus der spiele tabelle alle Mannschaften laden und dazu dir Form anzeigen lassen. Weiß jemand wie das gehen könnte?
select s.id_heim as id_test, heim_form.id, heim_form from spiel s join(
(select id_gast as id, GROUP_CONCAT(if(id_gast=id_test and tor_h>tor_g,'s',if(id_gast=id_test and tor_h=tor_g,'u',if(id_gast=id_test and tor_h<tor_g,'n',''))) SEPARATOR '') as gast_form from spiel
where id_gast=id_test and tor_h is not null and saison=2012 and id_liga=36 and datum<(SELECT datum FROM spiel where saison=2012 and id_liga=36 and spieltag=32 order by datum limit 1) order by datum) as gast_form)
on (form.id=heim_form.id and heim_form.id=gast_form.id)
where s.id_liga=36 and saison=2012 group by id_heim
Hi,
Ich versuche per Select abfrage einige Daten zusammen zufassen. Aber leider kann ich den Wert aus der ersten select abfrage im subselect nicht in der if Klausel benutzen. Ich möchte mir aus der spiele tabelle alle Mannschaften laden und dazu dir Form anzeigen lassen. Weiß jemand wie das gehen könnte?
Ich verstehe deine Frage nicht.
select s.id_heim as id_test, heim_form.id, heim_form from spiel s join(
(select id_gast as id, GROUP_CONCAT(if(id_gast=id_test and tor_h>tor_g,'s',if(id_gast=id_test and tor_h=tor_g,'u',if(id_gast=id_test and tor_h<tor_g,'n',''))) SEPARATOR '') as gast_form from spiel
where id_gast=id_test and tor_h is not null and saison=2012 and id_liga=36 and datum<(SELECT datum FROM spiel where saison=2012 and id_liga=36 and spieltag=32 order by datum limit 1) order by datum) as gast_form)
on (form.id=heim_form.id and heim_form.id=gast_form.id)
where s.id_liga=36 and saison=2012 group by id_heim
Auch SQL kann man einrücken. Die Mühe geb ich mir hier aber nicht.
Anders ausgedrückt: versuche bitte deine Frage nochmal klarer zu stellen. Wie sehen deine Tabellen aus (Struktur, Beispieldaten)? Was ist das Ergebnis, was du dir erwünscht? Was sind deine Versuche, wo hast du Verständigungsprobleme? Dann wird dir auch geholfen.
Bis die Tage,
Matti
--
[Webapplikationen in C++ entwickeln](http://tntnet.org/)
Hiho!
Ok ich versuche es noch ein mal deutlicher. Also ich habe
select id_heim as id,
GROUP_CONCAT(if(id_heim=2435 and tor_h>tor_g,'S',if(id_heim=2435 and tor_h=tor_g,'U',if(id_heim=2435 and tor_h<tor_g,'N',''))) SEPARATOR '') as heim_form
from spiel
where id_heim=2435
and tor_h is not null
and saison=2012
and id_liga=36
and datum<(SELECT datum FROM spiel where saison=2012 and id_liga=36 and spieltag=32 order by datum limit 1)
group by id_heim order by datum
Da kommt dann raus:
2435, 'USSUNSSNNSSSSS'
Das ist auch richtig und passt. Jetzt möchte ich aber nicht jede ID einzeln Abfragen, sondern ich hätte gerne eine Tabelle wo die ganzen Werte stehen. Das habe ich so versucht.
select id_heim as id,
GROUP_CONCAT(if(id_heim=id_heim and tor_h>tor_g,'S',if(id_heim=id_heim and tor_h=tor_g,'U',if(id_heim=id_heim and tor_h<tor_g,'N',''))) SEPARATOR '') as heim_form
from spiel
where id_heim=id_heim
and tor_h is not null
and saison=2012
and id_liga=36
and datum<(SELECT datum FROM spiel where saison=2012 and id_liga=36 and spieltag=32 order by datum limit 1)
group by id_heim order by datum
Dann kommt aber
177, 'NUSNSSSUSNSNN'
2435, 'SSUSSNSUNSSNSS'
189, 'SSNSNSSUNUNU'
665, 'SUSUSSUNSUSNS'
183, 'USSSSSSSUNSN'
180, 'USUUSNNNSSUSUU'
179, 'SNNNUUNSNNUSN'
666, 'USNSUSNUNNSS'
176, 'NSSNUNUNNNSN'
181, 'SSSSSUSSSUU'
174, 'USSSSNSNSNSS'
188, 'SNSSSNSNUNN'
175, 'SSNUSNSNSNN'
185, 'SNUSSSSSSSU'
186, 'SNSSSUSSUUSS'
667, 'UNSSNUNSSSSS'
178, 'NNSSSUSSNU'
182, 'UUSSSUSSSSS'
187, 'SSSNSSNSSUSNNU'
Wie man hier an der Zeile
2435, 'SSUSSNSUNSSNSS' sieht passt die nicht und ist falsch. :(
2435, 'USSUNSSNNSSSSS' das sollte dort normal stehen.
Die Anzahl stimmt, aber das sortieren nach der Zeit scheint nicht mehr zupassen.
Hi,
Ich versuche per Select abfrage einige Daten zusammen zufassen. Aber leider kann ich den Wert aus der ersten select abfrage im subselect nicht in der if Klausel benutzen. Ich möchte mir aus der spiele tabelle alle Mannschaften laden und dazu dir Form anzeigen lassen. Weiß jemand wie das gehen könnte?
Ich verstehe deine Frage nicht.
select s.id_heim as id_test, heim_form.id, heim_form from spiel s join(
(select id_gast as id, GROUP_CONCAT(if(id_gast=id_test and tor_h>tor_g,'s',if(id_gast=id_test and tor_h=tor_g,'u',if(id_gast=id_test and tor_h<tor_g,'n',''))) SEPARATOR '') as gast_form from spiel
where id_gast=id_test and tor_h is not null and saison=2012 and id_liga=36 and datum<(SELECT datum FROM spiel where saison=2012 and id_liga=36 and spieltag=32 order by datum limit 1) order by datum) as gast_form)
on (form.id=heim_form.id and heim_form.id=gast_form.id)
where s.id_liga=36 and saison=2012 group by id_heim
>
> Auch SQL kann man einrücken. Die Mühe geb ich mir hier aber nicht.
>
> Anders ausgedrückt: versuche bitte deine Frage nochmal klarer zu stellen. Wie sehen deine Tabellen aus (Struktur, Beispieldaten)? Was ist das Ergebnis, was du dir erwünscht? Was sind deine Versuche, wo hast du Verständigungsprobleme? Dann wird dir auch geholfen.
>
> Bis die Tage,
> Matti
Noch eine Infos, das order by scheint nicht zu klappen. :(
Tach,
Das ist auch richtig und passt. Jetzt möchte ich aber nicht jede ID einzeln Abfragen, sondern ich hätte gerne eine Tabelle wo die ganzen Werte stehen. Das habe ich so versucht.
select id_heim as id,
GROUP_CONCAT(if(id_heim=id_heim and tor_h>tor_g,'S',if(id_heim=id_heim and tor_h=tor_g,'U',if(id_heim=id_heim and tor_h<tor_g,'N',''))) SEPARATOR '') as heim_form
from spiel
where id_heim=id_heim
and tor_h is not null
and saison=2012
and id_liga=36
and datum<(SELECT datum FROM spiel where saison=2012 and id_liga=36 and spieltag=32 order by datum limit 1)
group by id_heim order by datum
Punkt 1: id\_heim=id\_heim ist immer wahr (ausser, wenn es null ist), das kannst du also streichen.
Punkt 2: ORDER BY passiert erst nach GROUP BY (afair: FROM, WHERE, GROUP, HAVING, SELECT, ORDER): Du versuchst nach einer Spalte zu sortieren, nach der nicht gruppiert wurde, das kann nicht funktionieren und andere DBMS als MySQL würden das vermutlich als Fehler werten; MySQL nutzt als Datum einen der möglichen Werte zufällig.
> 2435, 'SSUSSNSUNSSNSS' sieht passt die nicht und ist falsch. :(
> 2435, 'USSUNSSNNSSSSS' das sollte dort normal stehen.
Punkt 3: 'SSUSSNSUNSSNSS' und 'USSUNSSNNSSSSS' sind bis auf die Reihenfolge identisch, das liegt daran, dass die Reihenfolge der Ergebnisse innerhalb der Gruppierung zufällig ist, du wirst vermutlich mindestens einen weiteren Subselect brauchen:
~~~sql
SELECT
a.id_heim as id,
GROUP_CONCAT(if(a.tor_h>a.tor_g,'S',if(a.tor_h=a.tor_g,'U',if(a.tor_h<a.tor_g,'N',''))) SEPARATOR '') as heim_form
FROM (
SELECT id_heim,tor_h,tor_g
FROM spiel
WHERE
tor_h is not null
AND saison=2012
AND id_liga=36
AND datum<(
SELECT datum
FROM spiel
WHERE
saison=2012
AND id_liga=36
AND spieltag=32
ORDER BY datum
LIMIT 1
)
ORDER BY datum
) as a
GROUP BY id_heim;
(ungetestet, aber sowas in der Art soltle es sein)
mfg
Woodfighter
Hiho!
Leider bin ich jetzt erst zum testen gekommen, aber das hat genau die gleichen Probleme. :( Also die order by alleine gehen, sobald das Group dazu kommt ist es wieder vorbei.
Dabei wird es ja im Subselect richtig sortiert. :(
Tach,
Leider bin ich jetzt erst zum testen gekommen, aber das hat genau die gleichen Probleme. :( Also die order by alleine gehen, sobald das Group dazu kommt ist es wieder vorbei.
Dabei wird es ja im Subselect richtig sortiert. :(
ok, ein kurzer Blick in die Doku, zeigt allerdings den richtigen Weg:
SELECT
id_heim as id,
GROUP_CONCAT(if(a.tor_h>a.tor_g,'S',if(a.tor_h=a.tor_g,'U',if(a.tor_h<a.tor_g,'N',''))) ORDER BY datum SEPARATOR '') as heim_form
FROM spiel
WHERE
tor_h is not null
AND saison=2012
AND id_liga=36
AND datum<(
SELECT datum
FROM spiel
WHERE
saison=2012
AND id_liga=36
AND spieltag=32
ORDER BY datum
LIMIT 1
)
ORDER BY datum
)
GROUP BY id_heim;
mfg
Woodfighter
Ah danke, man muss also bei dem Group_concat auch noch das order angeben. Vielen dank für deine Hilfe! Das hat mir wirklich sehr geholfen. Den Absatz hatte ich übersehen. Besser ich habe im Netz beim Googlen immer nur den Punkt mit der Subquery gefunden und nicht das andere.