# Java fügt Datensätze ein aber diese werden nicht richtig abgefragt



## Jeldrik (14. Mai 2019)

Also ich habe ein eigenartiges Problem welches bei manchen Änderungen meines Programms passiert ist. Ich trage mit dem JDBC Treiber, Datensätze in eine MySQL Tabelle ein. Dies passiert auch erfolgreich und ich kann mir die Datensätze anzeigen lassen. Wenn ich aber meinen Select Befehl ausführe, werden nur solche Datensätze angezeigt, die ich Manuell eingefügt habe. Nicht die, welche ich über mein Programm erstelle. Hier kommt aber wieder das Problem, dass andere Select befehle diese Datensätze anzeigen. Es muss also irgendwo dort ein Problem geben.

Der Select Befehl soll mir die Letzten 5 Votes jedes Users anzeigen lassen:

```
SELECT DISTINCT V.bandtitel, V.titel, V.genre, count(p_voteid) AS AnzahlVotes FROM t_votes as V
WHERE V.p_voteid
IN(SELECT V2.p_voteid
FROM t_votes AS V2
WHERE V2.p_voteid >=(SELECT V3.p_voteid
FROM t_votes AS V3
WHERE V3.f_nutzerid = V2.f_nutzerid
ORDER BY V3.p_voteid DESC
LIMIT 1 OFFSET 4))
GROUP BY bandtitel, titel, genre
ORDER BY AnzahlVotes DESC;
```
Mit dieser Methode trage ich in die Datenbank ein:

```
public void Vote_eintragen(DatenManager dm, Vote v) {
        try {
            // JDBC-Treiber laden
            Class.forName(driver);
            // Verbindung aufbauen
            Connection con;
            con = DriverManager.getConnection(url, user, password);
            String sql = "INSERT INTO T_votes (bandtitel, titel, genre, f_nutzerid) values(?,?,?,?);";
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, v.getBandtitel());
            ps.setString(2, v.getTitel());
            ps.setString(3, v.getGenre());
            ps.setInt(4, sectionID);
            ps.executeUpdate();
            con.close();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
```
Diese Methode wird nochmal durch eine andere Aufgerufen:

```
public void abschicken(Nutzer n) {
        for (int i = 0; i < n.getVotes().size(); i++) {
            database.Vote_eintragen(this, n.getVotes().get(i));
        }
        if (isAlteVotesGelöscht()) {
            database.votesLöschen(n);
        }
    }
```
Ich wäre sehr Dankbar für Hilfe, da dieses Problem so inkonsistent ist. Manchmal Funktioniert mein Select plötzlich doch wieder, weshalb ich es am ehesten auf das Eintragen in die Datenbank zurück führe.


----------



## mihe7 (14. Mai 2019)

Jeldrik hat gesagt.:


> Der Select Befehl soll mir die Letzten 5 Votes jedes Users anzeigen lassen:


Soll vielleicht schon, nur macht er das nicht.

Im innersten SELECT (V3) suchst Du für jeden User die ID des fünft-letzten Votes heraus. Im nächsten SELECT (V2) nimmst Du nun alle Votes, die größer oder gleich dieser ID sind und zwar unabhängig vom User. Wenn also VoteID 1 die fünft-letzte VoteID eines Users ist, dann dürftest Du die gesamte Votes-Tabelle als Ergebnis bekommen.

Dass mit der Gruppierung nicht die letzten 5 Votes jedes Users angezeigt werden (das wären ja für jeden User 5 Zeilen), führe ich mal auf eine saloppe Formulierung zurück


----------



## Jeldrik (14. Mai 2019)

mihe7 hat gesagt.:


> Soll vielleicht schon, nur macht er das nicht.
> 
> Im innersten SELECT (V3) suchst Du für jeden User die ID des fünft-letzten Votes heraus. Im nächsten SELECT (V2) nimmst Du nun alle Votes, die größer oder gleich dieser ID sind und zwar unabhängig vom User. Wenn also VoteID 1 die fünft-letzte VoteID eines Users ist, dann dürftest Du die gesamte Votes-Tabelle als Ergebnis bekommen.
> 
> Dass mit der Gruppierung nicht die letzten 5 Votes jedes Users angezeigt werden (das wären ja für jeden User 5 Zeilen), führe ich mal auf eine saloppe Formulierung zurück


Also wenn ich recht verstanden habe müsste ich dann ja die Ganze Tabelle bekommen, hab ich aber nicht sondern ja im gegenteil, die neuesten Votes wurden nicht angezeigt^^ Habe das problem mit einem COALESCE Befehl gelöst. Trotzdem Danke!


----------



## mihe7 (14. Mai 2019)

Sorry, das war geistige Umnachtung: Du verknüpft ja v2 und v3 über den User.

Ich verstehe jetzt allerdings nicht, was Du eigentlich rausbekommen willst.


----------

