baeckerman83: MYSQL 5 Subselect verhindern

Hiho!
Ich habe eine Select in MYSQL geschrieben, das funktioniert auch:

select id_spiel,  
(select q1.odd as q1 from quoten_info q1 where s.id_spiel_xml_odd=q1.id_odd_xml and q1.id_type=1 and q1.odd_name='1' order by q1.odd DESC LIMIT 1) as q1,  
(select q0.odd as q0 from quoten_info q0 where s.id_spiel_xml_odd=q0.id_odd_xml and q0.id_type=1 and q0.odd_name='X' order by q0.odd DESC LIMIT 1) as q0,  
(select q2.odd as q2 from quoten_info q2 where s.id_spiel_xml_odd=q2.id_odd_xml and q2.id_type=1 and q2.odd_name='2' order by q2.odd DESC LIMIT 1) as q2  
from spiel s;

Dieses soll mir zu jedem Spiel, hier mit id_spiel bezeichnet, die jeweils höchste Heimquote (q1), Unentschiedenquote (q0) und Auswärtsquote (q2) liefern. Als select mit Subquerys ist das ganze aber doch ziemlich schlecht, denn die Abfrage dauert ewig. Als Abfrage mit Joins bekomme ich es nicht hin, da ich immer mehr als eine Quote pro Spiel raus bekomme und nicht nach allen drei Sortieren kann. Leider ist die Datenbankstruktur an der Stelle vom Quoten lieferanten vorgegeben.
Hat jemand eine Idee wie ich die Abfrage besser gestalten kann?

  1. gudn tach!

    select id_spiel,

    (select q1.odd as q1 from quoten_info q1 where s.id_spiel_xml_odd=q1.id_odd_xml and q1.id_type=1 and q1.odd_name='1' order by q1.odd DESC LIMIT 1) as q1,
    (select q0.odd as q0 from quoten_info q0 where s.id_spiel_xml_odd=q0.id_odd_xml and q0.id_type=1 and q0.odd_name='X' order by q0.odd DESC LIMIT 1) as q0,
    (select q2.odd as q2 from quoten_info q2 where s.id_spiel_xml_odd=q2.id_odd_xml and q2.id_type=1 and q2.odd_name='2' order by q2.odd DESC LIMIT 1) as q2
    from spiel s;

    
    >   
    > Dieses soll mir zu jedem Spiel, hier mit id\_spiel bezeichnet, die jeweils höchste Heimquote (q1), Unentschiedenquote (q0) und Auswärtsquote (q2) liefern.  
      
    du brauchst die tabelle `id\_spiel` gar nicht miteinzubeziehen, da du von ihr keine informationen extrahierst, die nicht schon in der anderen tabelle `quoten\_info` drinstehen (naemlich die id).  
      
    insofern kannst du wahrscheinlich einfach drei einfachere selects auf `quoten\_info` anwenden und dabei jeweils die [MAX](http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_max)-funktion sowie die [GROUP BY](http://dev.mysql.com/doc/refman/5.1/en/select.html#id798340)-funktionalitaet von sql verwenden.  
      
    prost  
    seth
    
    1. du brauchst die tabelle id\_spiel gar nicht miteinzubeziehen, da du von ihr keine informationen extrahierst, die nicht schon in der anderen tabelle quoten\_info drinstehen (naemlich die id).

      prost
      seth

      Hi doch ich brauche die id_spiel aus der Tabelle spiele. Die steht direkt hinter dem select.

      1. gudn tach!

        Hi doch ich brauche die id_spiel aus der Tabelle spiele. Die steht direkt hinter dem select.

        oops, stimmt, hatte nicht gesehen, dass die beiden tabellen ueber eine andere id verknuepft werden, als angezeigt werden soll.
        ich denke trotzdem, dass es ueber drei separate selects schneller/schoener zu realisieren ist. aber vielleicht hat ja noch jemand anders eine idee.

        prost
        seth

  2. Hi,

    Hiho!
    Ich habe eine Select in MYSQL geschrieben, das funktioniert auch:

    select id_spiel,

    (select q1.odd as q1 from quoten_info q1 where s.id_spiel_xml_odd=q1.id_odd_xml and q1.id_type=1 and q1.odd_name='1' order by q1.odd DESC LIMIT 1) as q1,
    (select q0.odd as q0 from quoten_info q0 where s.id_spiel_xml_odd=q0.id_odd_xml and q0.id_type=1 and q0.odd_name='X' order by q0.odd DESC LIMIT 1) as q0,
    (select q2.odd as q2 from quoten_info q2 where s.id_spiel_xml_odd=q2.id_odd_xml and q2.id_type=1 and q2.odd_name='2' order by q2.odd DESC LIMIT 1) as q2
    from spiel s;

      
    select max(odd), id\_odd\_xml, odd\_name from quoten\_info group by id\_odd\_xml, odd\_name  
      
    bzw. wenn nur die Spiele abgefragt werden sollen, die in spiel vorkommen  
      
    select max(odd), id\_odd\_xml, odd\_name from quoten\_info where exists (select id\_spiel from spiel where id\_spiel = id\_odd\_xml) group by id\_odd\_xml, odd\_name  
      
      
    Die Daten zu einem Spiel kommen dabei halt nicht als ein Datensatz, sondern als bis zu 3.  
    Das muß man dann halt bei der Aufbereitung der Daten zur Ausgabe berücksichtigen ...  
      
    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.