MySQL 10 höchsten Werte aus einer Tabelle ermitteln

Dimax

Top Contributor
Hallo Leute,
wie kann man 10 höchsten Werte aus einer Tabelle ermitteln?
Ich habe eine Tabelle "Programm". Das sieht ungefähr so aus
projekt_id | programm_id | komplexität |

ich brauche 10 programm_id's mit dem größten Komplexitätswert.

Vielen dank im voraus .
 

Robat

Top Contributor
Vielleicht so
SQL:
SELECT programm_id
FROM Programm
ORDER BY komplexität  DESC
LIMIT 10
 

Dimax

Top Contributor
Hab grade getestet,dass war die Lösung die ich gesucht habe. Danke Robat nochmals.Weist du vielleicht auch wie man die Ergebnisse in Variablen speichert.
ich hab bis jetzt ResultSet benutzt. ResultSet.getString(columnindex), aber wenn ich im column 1 10 rows hab wie kriege ich column 1 row 2 zmb.?
 

Robat

Top Contributor
Java:
ResultSet resultSet = stmt.execteQuery(query);
while(resultSet.next()) { // für jede row im ResultSet
     String x = resultSet.getString("firstCol");
     int y = resultSet.getInt("secondCol");
}
 

mihe7

Top Contributor
aber wenn ich im column 1 10 rows hab wie kriege ich column 1 row 2 zmb.?
Du hast ein ResultSet, z. B. rs, dann
Java:
List<Long> ergebnis = new ArrayList<>();
while (rs.next()) {
    ergebnis.add(rs.getLong(1));
}
return ergebnis;
Mit der Liste kannst Du dann machen, was Du willst, z. B. liste.get(1); liefert die Programm-ID des Programms mit der zweitgrößten Komplexität.
 

Dimax

Top Contributor
Danke Jungs für die Hilfe.
Hab probiert grade.
Java:
public static String [][] analysieren()  {
        List<String> topTenKomplex=new ArrayList<>();
        String topTen=new String("SELECT programm_id FROM Programm"+
                                                "ORDER BY komplexität  DESC LIMIT 10");
try{
Connection cn=null;          
            Class.forName(sDbDrv);
            cn = DriverManager.getConnection(sDbUrl, sUsr, sPwd);
Statement st1=null;
ResultSet rs1=null;
st1=cn.createStatement();
rs1=st1.executeQuery(topTen);
while(rs1.next()){
                topTenKomplex.add(rs.getString(1));
            }
System.out.println(topTenKomplex.get(1));
}catch(Exception e){e.printStackTrace();}
}
Folgende Fehelermeldung:
Java:
java.sql.SQLException: After end of result set
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:127)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:87)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:61)
    at com.mysql.cj.jdbc.result.ResultSetImpl.checkRowPos(ResultSetImpl.java:506)
    at com.mysql.cj.jdbc.result.ResultSetImpl.getString(ResultSetImpl.java:869)
    at daten.einlesen.ProgrammAnalyse.analysieren(ProgrammAnalyse.java:56)
    at daten.einlesen.ProgrammAnalyse.main(ProgrammAnalyse.java:19)
woran kann es liegen?
 

mihe7

Top Contributor
Noch ein paar Anmerkungen: die Connection erzeugt man für gewöhnlich nicht jedesmal neu und Class.forName ist bei einem aktuellen JDBC-Treiber nicht mehr notwendig. new String() ist überflüssig. Die Initialisierungen mit null kannst Du Dir auch sparen. Außerdem kannst Du try-with-resources verwenden. Sollte in etwa so funktionieren:

Java:
public static void analysieren()  {
    String topTen = "SELECT programm_id FROM Programm"+
            " ORDER BY komplexität  DESC LIMIT 10";
    try(Connection cn = DriverManager.getConnection(sDbUrl, sUsr, sPwd);
          Statement st = cn.createStatement();
          ResultSet rs = st.executeQuery(topTen)) {
        List<String> topTenKomplex=new ArrayList<>();
        while (rs.next()) {
            topTenKomplex.add(rs.getString(1));
        }
        System.out.println(topTenKomplex.get(1));
    } catch (SQLException ex) {
        ex.printStackTrace();
    }
}
 

mihe7

Top Contributor
Ich erzeuge Connection in jeder Methode wo ich sie brauch und zum Schluss schlisse. Ist das Falsch?
Falsch wäre es, wenn es nicht funktioniert :)

Warum man das normalerweise nicht macht, hat wenigstens zwei Gründe:

1. es ist relativ teuer, eine Verbindung aufzubauen
2. Kopplung und Kohäsion

Grundsätzlich muss man immer abwägen. Wenn ich in meinem Programm an einer Stelle alle Stunde mal eine DB-Abfrage machen müsste, dann würde ich da auch nicht rumeiern.

Hat man z. B. ein UI, wo man ständig die DB bemühen, ggf. für eine "Maske" mehrere Abfragen ausführen muss, dann sieht die Sache bzgl. 1. schon anders aus.

Gleiches gilt für die Programmstruktur: Verbindungsaufbau ist eine Sache, Verbindung benutzen, um Abfragen auszuführen, eine andere.

Wenn die Klasse (oder gar die Methode), die die Abfrage durchführt, auch die Verbindung aufbaut, sind diese Dinge stark gekoppelt (bilden also eine Einheit), obwohl sie logisch nicht zusammengehören (schwache Kohäsion). Das erklärte Ziel ist das genaue Gegenteil davon.
 

Dimax

Top Contributor
Falsch wäre es, wenn es nicht funktioniert :)

Wenn die Klasse (oder gar die Methode), die die Abfrage durchführt, auch die Verbindung aufbaut, sind diese Dinge stark gekoppelt (bilden also eine Einheit), obwohl sie logisch nicht zusammengehören (schwache Kohäsion). Das erklärte Ziel ist das genaue Gegenteil davon.
Wenn ich dich richtig verstanden habe ,wäre dann für mich besser eine Methode zu basteln die mir Verbindung bereitstellt.So was wie
Java:
    public static Connection eureVerbindungMeinHerr(){      
        String sDbUrl = MYSQLparameter.getURL();
        String sUsr = MYSQLparameter.getUser();
        String sPwd = MYSQLparameter.getPassword();
       
        try{
            Connection cn=DriverManager.getConnection(sDbUrl, sUsr, sPwd);
        }catch(SQLException e){e.printStackTrace();}
        return cn;       
    }
Und dan überall wo ich es brauch die Methode aufrufen?
Java:
public static irgendeineMethode(){
Connection cn=eureVerbindungMeinHerr();
//hier mache ich etwas
cn.close()
}
 

mrBrown

Super-Moderator
Mitarbeiter
So passiert genau das gleiche wie jetzt, in jeder Methode wird die Verbindung neu hergestellt und auch geschlossen und die Methode ist selbst dafür verantwortlich.

Besser wäre es, der Methode die Connection zu übergeben - Erstellen und schließen ist dann nicht mehr Verantwortung der einzelnen Methoden und du kannst, wenn nötig, die Verbindung mehrmals verwenden.
 

mihe7

Top Contributor
Jein. Ein Teil von dem, was Du jetzt gemacht hast, ist DRY (don't repeat yourself). Dieses Prinzip solltest Du grundsätzlich möglichst überall durchsetzen.

Du rufst in irgendeineMethode jetzt eine globale Methode auf. D. h. das Verhältnis zwischen irgendeineMethode und eureVerbindungMeinHerr ist immer noch fix im Code; Du kannst Die Verbindung nicht tauschen.

Was ich meinte, ist etwas wie:

Java:
class Users {
    private static final String SQL_LOGIN =
        "SELECT 1 FROM users WHERE username=? AND password=?";
    private static final String SQL_COUNT =
        "SELECT count(*) FROM users";

    private Connection conn;

    public Users(Connection conn) { this.conn = conn; }

    public boolean login(String username, String password) throws SQLException {
        try(PreparedStatement stmt = conn.prepareStatement(SQL_LOGIN)) {
            stmt.setString(1, username);
            stmt.setString(2, hash(password));
            try(ResultSet rs = stmt.executeQuery()) {
                return rs.next();
            }
        }
    }

    public int count() throws SQLException {
        try(Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(SQL_COUNT);
             int result = 0;
             if (rs.next()) { result = rs.getInt(1); }
             return result;
        }
    }
}
 

Dimax

Top Contributor
Danke Jungs für die Bemühungen mir etwas beizubringen.
Leider muss ich feststellen ,dass ich mich noch auf einem tiefen Wissensstand befinde und
die letzten Vorschläge nicht umsetzen kann.
Aber auch weil mein Programm ,ein internes Projekt mit nur 1 User ,pwd usw. ist.
Also so was wie class Users brauch ich nicht.Ist alles bei mir in MYSQLparameter gespeichert.
Und für den Prinzip des Verbindungsaufbau sowie auch für die Schließung hab leider kein Plan(.
Den code von mihe7 kann ich verstehen aber für mein Programm ist es nicht nötig die Verbindungen
an mehrere users zu koppeln .
 

mihe7

Top Contributor
Darum:
Wenn ich in meinem Programm an einer Stelle alle Stunde mal eine DB-Abfrage machen müsste, dann würde ich da auch nicht rumeiern.
:)

Probleme bekommst Du vermutlich erst, wenn Dein Code komplexer wird. So lange es für Dich in Ordnung ist, ist doch alles gut.

für mein Programm ist es nicht nötig die Verbindungen
an mehrere users zu koppeln .
?!?

Nochmal zur Klarstellung: es geht darum, eine Verbindung an verschiedenen Stellen zu verwenden. Die Klasse Users war dabei nur ein Beispiel. Ich hätte auch, wie von @mrBrown vorgeschlagen, den Parameter einfach an die Methode hängen können:
Java:
public void analyze() {
    Connection conn = neueVerbindungAufbauen();
    ...
    conn.close();
}

// vs

public void analyze(Connection conn) {
    ...
}
 

Dimax

Top Contributor
Die Initialisierungen mit null kannst Du Dir auch sparen.
[/code]
Das ist meine Angewohnheit von C. Da wird der Speicherplatz für neue Variable nur erteilt nicht geleert und deswegen kann neue Variable alles mögliche enthalten.Ich glaube in Java ist es anders aber bin mir nicht sicher.Wie ist es in Java?
 

mrBrown

Super-Moderator
Mitarbeiter
Das ist meine Angewohnheit von C. Da wird der Speicherplatz für neue Variable nur erteilt nicht geleert und deswegen kann neue Variable alles mögliche enthalten.Ich glaube in Java ist es anders aber bin mir nicht sicher.Wie ist es in Java?
In lokalen Variablen steht auch in Java „nichts“ drin, man kann deshalb nicht lesend drauf zugreifen, bis sie zugewiesen sind.

Initialisieren mit null ist aber deshalb Unsinn, weil du direkt danach einen richtigen Wert zuweißt. In C wären solche Zuweisungen mit Default-Werten genauso überflüssig ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Ataria SQLite Werte aus zwei Tabellen zusammenführen Datenbankprogrammierung 8
J Mehrere WHERE Werte benutzen Datenbankprogrammierung 2
P Null Werte bei der Normalisierung Datenbankprogrammierung 2
J keine Werte vom PHP Datenbankprogrammierung 3
L Java- Zähle alle Werte aus der Tabelle von aktiver Zelle Datenbankprogrammierung 12
MaxG. Datenbank werte vergleichen Datenbankprogrammierung 5
E Wie kann man in DB2 TIMESTAMP Werte hinzufügen? Datenbankprogrammierung 2
OnDemand SQL Query Anzahl der Werte Datenbankprogrammierung 8
ruutaiokwu sql server werte swappen beim update-vorgang mit unique-constraints..? Datenbankprogrammierung 2
S MySQL Nach wiederholtem Update falsche Werte (im Speicher?) Datenbankprogrammierung 1
L Werte in Datei speichern Datenbankprogrammierung 16
H MySQL Werte eines Datensatzes in einen anderen kopieren Datenbankprogrammierung 2
J Access Datenbank mit JAVA erstellen - boolean Werte Datenbankprogrammierung 4
E Werte auslesen Datenbankprogrammierung 3
D Alle Werte aus DB auslesen und in Chart darstellen Datenbankprogrammierung 6
pg1337 PostgreSQL Werte auf Eingabe speichern Datenbankprogrammierung 23
Z MySQL werte von formular speichern Datenbankprogrammierung 3
S Werte aus Datenbank auslesen und in eine bestimmte Excelzelle eintragen Datenbankprogrammierung 2
E Update DB; Werte aus Feldern übernehmen Datenbankprogrammierung 5
N Zwei Spalten und Ihre Werte vergleichen Datenbankprogrammierung 3
J SQL Abfrage: Verschiedene Werte in einer Spalte mit einem Update Befehl? Datenbankprogrammierung 7
D Werte mit java programm in eine Datenbank einlesen Datenbankprogrammierung 7
Landei Mehre Werte für einen Prepared-Statement_Parameter übergeben? Datenbankprogrammierung 3
G Einheitliches Casting für Decimal und Integer-Werte Datenbankprogrammierung 5
G Werte in DB multiplizieren Datenbankprogrammierung 5
A JList nimmt nicht alle Werte aus der DB auf Datenbankprogrammierung 3
Y Hibernate - Werte aus 2 Tabellen laden Datenbankprogrammierung 29
G Hilfe: Werte sind alle x2 (oder mehr) nach JOIN Datenbankprogrammierung 13
F JDBC Abfrage Werte auslesen Datenbankprogrammierung 2
E Vergleichen von datetime mit GregorianCalender-Werte Datenbankprogrammierung 6
K [hibernate] show_sql: Werte der Parameter anzeigen Datenbankprogrammierung 3
P MYSQL werte aus liste auslesen und anderen damit updaten Datenbankprogrammierung 4
G numerische werte Datenbankprogrammierung 6
V Werte über Konsole in Datenbank schreiben Datenbankprogrammierung 2
B Wie kann ich eine Jtable mit Inhalt einer SQL Abfrage füllen Datenbankprogrammierung 14
D Zweckmäßigkeit einer Schlüsseltabelle Datenbankprogrammierung 4
TH260199 Java-Programm. Probleme bei der Umsetzung von einer Kontaktverwaltung. Datenbankprogrammierung 7
S Variable in main soll mit der generierten Zahl aus einer Methode ausgefüllt werden Datenbankprogrammierung 3
N Oracle SQL - Nächst kleineren Namen2 zu einem Namen aus einer Tabelle Datenbankprogrammierung 3
T Datenbank auf einer Webseite aus einer Exceltabelle erstellen Datenbankprogrammierung 5
D JPA gleiche methode funktioniert an einer Stelle, an der anderen nicht Datenbankprogrammierung 3
nonickatall MySQL Auf neue Datensätze in einer Datenbank reagieren Datenbankprogrammierung 5
B Wie kopieren ich eine Spalte von einer Tabelle in eine andere Tabelle SQLite durch java code? Datenbankprogrammierung 26
P Verbindung zu einer Access Datenbank per Eclipse oder Intellij Datenbankprogrammierung 0
pkm Frage zu Encodingproblem bei einer Datenbankanbindung Datenbankprogrammierung 1
B Frage bei einer SQL Query Datenbankprogrammierung 3
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
J In einer bestimmten Spalte suchen mit Suchfeld (MS SQL) Datenbankprogrammierung 7
S Verbindung von einer Excel Datei zu Java Datenbankprogrammierung 2
J Sql Anfrage nach einer Zeile beenden Datenbankprogrammierung 6
J Welche Kriterien haben Einfluss auf die Geschwindigkeit einer Datenbank ? Datenbankprogrammierung 4
S Anmelden an einer msql datennbank Datenbankprogrammierung 1
F Auslesen einer .dbf-Datei, Zuordnung Index Datenbankprogrammierung 0
ralfb1105 Oracle Zwei ojdbc Driver in einer Applikation? Datenbankprogrammierung 13
Dimax MySQL Maximale Datenlänge für eine Spalte einer Datenbank in java ermitteln Datenbankprogrammierung 15
L Speicherverbrauch Java Anwendung mit einer Datenbankanbindung Datenbankprogrammierung 19
temi Wie kann ich "Class" in einer DB speichern? Datenbankprogrammierung 2
F UPDATE - Befehl nur in einer Zeile Datenbankprogrammierung 11
I Oracle Wie ermitteln, welche Benutzer-(!)Tabellen in einer DB sind? Datenbankprogrammierung 1
DaCrazyJavaExpert Derby/JavaDB Wert einer Variable in der Datenbank direkt auf 1 setzten. Datenbankprogrammierung 71
D MySQL Suche nach Max Value in einer Tabelle Datenbankprogrammierung 7
W Daten aus einer Datei von einem VServer auslesen Datenbankprogrammierung 1
F MySQL Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben? Datenbankprogrammierung 9
F Java Objekte in einer Datenbank speichern Datenbankprogrammierung 4
MrSnake Hilfe bei erstellen einer DB Datenbankprogrammierung 12
M Wie übergebe ich Datenbankobjekte aus einer sql-Datenbank einer Java Klasse bzw. Instanz Datenbankprogrammierung 7
Z Finde den Fehler: Daten aus einer Access-Datenbank lesen Datenbankprogrammierung 12
D Aktualisierung einer ListView mit Daten aus MySQL-DB Datenbankprogrammierung 5
E Wie kann man mit einer ID-Spalte über eine Parameterübergabe auf eine Seite verweisen? Datenbankprogrammierung 17
E Warum funktioniert das Erzeugen einer View nicht? Datenbankprogrammierung 1
E Kann man in einer if-Bedingung auch SELECT-Statements überprüfen? Datenbankprogrammierung 23
E Was sind die Vorteile von DB2 im Gegensatz zu einer Oracle-Datenbank? Datenbankprogrammierung 5
E Wie geschieht der konzeptueller Entwurf einer Datenbank Datenbankprogrammierung 1
I SQLite Objekt speichern einer Serialisierter Klasse Datenbankprogrammierung 1
D HSQLDB INSERT INTO in einer For Schleife mit selber ID, machbar? Alternative? Datenbankprogrammierung 7
I Inhalt einer hsqldb anzeigen Datenbankprogrammierung 1
J Realisierung einer DB in Combi mit Java Datenbankprogrammierung 13
Androbin [Serializing] Mehrere Objekte in einer einzigen Datei speichern Datenbankprogrammierung 1
S Auswahl einer Datenbank Datenbankprogrammierung 0
M Derby/JavaDB Speicherplatz einer Zeile bestimmen Datenbankprogrammierung 0
P JPA in einer größeren Java SE Anwendung Datenbankprogrammierung 0
R MySQL Blob aus DB auslesen und einer Tabelle ausgeben Datenbankprogrammierung 7
C H2 Syntax fehler beim erstellen einer Tabelle Datenbankprogrammierung 4
L MySQL Uhrzeit-Format innerhalb einer Tabelle Datenbankprogrammierung 8
2 MySQL Daten aus einer Array auslesen und MySQL Statment erstellen. Datenbankprogrammierung 5
S Derby/JavaDB Probleme beim anlegen einer embedded DB Datenbankprogrammierung 13
E Daten einer SQL-Datenbank aus Combobox in labels schreiben Datenbankprogrammierung 6
M Problem beim Erstellen einer Query Datenbankprogrammierung 7
L Datenbankabfrage mit einer Range Datenbankprogrammierung 3
S Anbindung einer Datenbank an Java Datenbankprogrammierung 7
H ResultSet is closed tritt bei JSF aber nicht bei einer Java-Applikation auf Datenbankprogrammierung 10
eskimo328 Datenbankverbindung ohne Passwort im Quelltext bei einer offline Anwendung Datenbankprogrammierung 14
C unverständliches DB Problem (Es ist kein temporärer Systemtabellenbereich mit einer ausreichenden..) Datenbankprogrammierung 5
A Oracle Update Befehl in Datenbank anhand einer Schleife Datenbankprogrammierung 8
Kenan89 Oracle Daten einer Tabelle in Array speichern Oracle Datenbankprogrammierung 10
S 2 Tabellen zu einer zusammenführen, INSERT INTO Fehler Datenbankprogrammierung 5
D Sperrverfahren in einer Datenbank Datenbankprogrammierung 6
B Feld in einer @Entity als Text speichern Datenbankprogrammierung 5
G Oracle Hibernate M:N-Beziehung mit nur einer vorhandenen Tabelle Datenbankprogrammierung 5
M MySQL Auto-Increment einer custom formatted id? Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben