Methoden while liefert nur den ersten Datensatz

MarcAber

Mitglied
Hallo zusammen,
ich habe sowohl google als auch forensuche oder faq durchforstet. Leider keine Lösung für mein Problem gefunden. Ich hoffe ich habe nichts übersehen und erzeuge hier redundante Einträge. Wenn ja, sorry dafür.

ich habe eine Tabelle in einer mysql datenbank:
id;gruppe;team;punkte
Hier finden sich in beliebiger Reihenfolge Datensätze in der Form wie oben angezeigt. Jetzt versuche ich verzweifelt eine Platzierung zu generieren. Das bedeutet, ich benötige pro Gruppe die Platzierung anhand der Punkte.

Also suche ich mir im Step 1 die Gruppen heraus und lasse die Einträge nach gruppe gruppieren. bekomme also brav eine Liste der vorhandenen Gruppen, wobei durch den GROUP Parameter ja nur ein Eintrag pro Gruppe angezeigt wird. Also alles gut. Der Step funktioniert auch.
Hie rder Code zu Step 1
Code:
public void TestStep1(){
        try{
            String  sql =   "SELECT gruppe FROM TestTabelle GROUP BY gruppe";
                    pst =   conn.prepareStatement(sql);
                    rs  =   pst.executeQuery();
                    while(rs.next()){
                        TestStep2(rs.getString("gruppe"));
                    }
        }catch(Exception e){JOptionPane.showMessageDialog(null, e);}
}

Innerhalb der While Schleife springe ich in TestStep2, wobei ich den Parameter der Gruppe übergebe und die SQL Abfrage entsprechend vornehme:

Code:
public void TestStep2(String gruppe){
    try{
          String  platzierung =   "SELECT id,team,punkte FROM TestTabelle WHERE gruppe = '"+gruppe+"' ORDER BY punkte DESC";
                     pst         =   conn.prepareStatement(platzierung);
                     rs          =   pst.executeQuery();logger.info(pst);
                              int platz   =   1;
                                while(rs.next()){
                                    String  id      =   rs.getString("id");
                                    String  team    =   rs.getString("team");
                                    String  punkte  =   rs.getString("punkte");
                                logger.info("Füge ein: " + platz +" "+ gruppe + " " + team + " " + punkte);
                                platz++;
                    }
                        }catch(Exception e){JOptionPane.showMessageDialog(null, e);}
}

Dummerweise durchläuft mir der Step2 die Schleife, findet aber irgendwie nicht zurück in den Step1 um die Schleife in Step1 weiter abzuarbeiten.

Ausgabe der logger.info:
Code:
Füge ein: 1 A1 97 19
Füge ein: 2 A1 29 13
Füge ein: 3 A1 11 7 
Füge ein: 4 A1 8 7 
Füge ein: 5 A1 15 7 
Füge ein: 6 A1 14 7

Jetzt fehlen mir jedoch die Einträge für gruppe A2 oder B1 oder oder oder ... Also springt mir java nicht zurück zur Schleife in Step1. Warum?

Ich muss dazu sagen, dass es sich um fiktive Einträge handelt. Ja, mir ist klar, dass die Punktzahl 7 auf Platz 3 gleichzusetzen wäre mit der von Platz 6. zur Info: es gibt mehrere Kriterien, an denen die Punkte festgemacht werden. Diese habe ich hier der Einfachheit jedoch rausgenommen.

Ich wäre sehr dankbar für Informationen, die mir zur Lösung des Problems verhelfen.
 
Wie soll es auch wenn du pst und rs als instanzvariable benutzt und damit in step2 die werte in step1 überschreibst? Warum sind das keine lokalen Variablen?
 
ok. vielleicht hab ich da ein verstaendnisproblem...
ich habe das bislang so gelöst:

die verbindung setze ich in javaconnect.java
meine anderen klassen fange ich so an:

Code:
public class TestKlasse {
    private static Logger logger = Logger.getLogger( TestKlasse.class );
    Connection conn = null;
    ResultSet rs = null;
    PreparedStatement pst = null;

    public TestKlasse() throws IOException{
       conn=javaconnect.ConnecrDB();
}

und greife dann in den jeweiligen methoden folgendermassen zu:

Code:
            String sql  =   "blablasqlanweisung";
                pst=conn.prepareStatement(sql);
                pst.execute();

was könnte ich verbessern?
 
hm ... ok. ich werd da mal mit rumprobieren.
so ganz erschliesst sich mir nicht der sinn, die variablen jedes mal lokal zu deklarieren. ausser hier in der mehrfachen schleifen geschichte.
 
so ganz erschliesst sich mir nicht der sinn, die variablen jedes mal lokal zu deklarieren. ausser hier in der mehrfachen schleifen geschichte.
Man will keine Seiteneffekte haben. Ist eben blöd, wenn das Programm nicht mehr funktioniert, nur weil an einer ganz anderen Stelle, eine namensgleiche Variable benutzt wird.

Warum machst du es eigentlich überhaupt mit zwei Abfragen? Du hättest die Daten doch auch mit einem einzigen Query abfragen können.
 
da ist die platzierung ja pro gruppe festlege, muesste ich dann abfragen ob sich die gruppe aendert und daraufhin wieder den zaehler auf 1 setzen. hochzaehlen bringt auch nichts, da in einer gruppe 2 -x teams sein koennen. so wars leichter. fand ich zumindest.
 
Stimmt, so etwas müsstest du dann machen, würdest dafür aber den Code für die zusätzliche Abfrage sparen. Vor allem würden aber - je nach Datenkonstellation - deutlich weniger Abfragen ausgeführt werden. Angenommen die erste Abfrage liefert 100 Zeilen. Dann würdest du die zweite Abfrage 100 Mal durchführen. Insgesamt würdest du also 101 SQL-Befehle zur DB senden und 101 Ergebnismengen zurück erhalten. Die Latenzzeit für die Kommunikation würde also 202 mal anfallen. Nötig wären aber nur zwei Latenzzeiten (ein Befehl hin, eine Ergebnismenge zurück).
 

Zurück
Oben