baeckerman83: MYSQL Subselect mit Werten aus select?

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
  1. 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/)
    
    1. 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
      
      1. Noch eine Infos, das order by scheint nicht zu klappen. :(

      2. 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

        1. 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. :(

          1. 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

            1. 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.