# geänderte SELECT Abfragen



## didi577 (1. Feb 2017)

Hi,

ich habe eine Tabelle fragen in der Datensätze mit IDs aus anderen Tabellen gespeichert werden. Vorher hatte ich Strings mit Namen etc. gespeichert.
Alle meine Abfragen müssen natürlich angepasst werden da anstelle der lesbaren Strings die IDs angezeigt werden. Hier ein Auschnitt aus fragen:

In den Spalten kurs, ort, dozent stehen die IDs aus den anderen Tabellen.
In einer AuswertungsGUI lade ich zum Beispiel eine Combobox mit dem Dozent:

```
mysql.ladenBoxDozent(boxDozentM "select DISTINCT dozent from fragen ORDER BY dozent");
```
Das bringt mir bspw. für den Eintrag fragen_id 81 eine 24 in der Combobox...logisch! Ich habe auch verschiedene Labels in denen ich Werte aus der fragen Tabelle anzeige.

Mein Ziel ist es in den Auswertungen und Labels die Werte der Spalten mit den Strings anstelle der IDs anzuzeigen, z.B. die Spalte name aus der Tabelle dozenten. Mir fehlt jetzt nur der richtige Ansatz hierfür. Löse ich das über geänderte Abfragen mit join etc.?


----------



## Joose (1. Feb 2017)

Ja JOINs wären eine Möglichkeit.


----------



## didi577 (1. Feb 2017)

ok, Danke dann werde ich mich da mal einlesen


----------



## didi577 (1. Feb 2017)

welche Möglichkeiten gibts denn noch? oder anders gefragt...welche ist denn die eleganteste Lösung?


----------



## Joose (1. Feb 2017)

Eine andere Variante wäre es ein Extra SELECT abzusetzen um die Daten für einen bestimmten Dozenten zu laden und mit diesen Daten dann Dozent Objekte zu erstellen.
Wieder eine andere Variante wäre es einen ORM zu verwenden


----------



## didi577 (1. Feb 2017)

Joose hat gesagt.:


> Eine andere Variante wäre es ein Extra SELECT abzusetzen um die Daten für einen bestimmten Dozenten zu laden und mit diesen Daten dann Dozent Objekte zu erstellen.


das ist mein Favorit, da ich hier dem Objekt noch Attribute aus der Dozenten Tabelle mitgeben kann die ich nach der Auswertung noch benötige (zB eine Mail versenden->in der Dozenten Tabelle ist auch die Mailadresse gespeichert)

beim Start der Anwendung befülle ich eine Combobox schon mit Dozentobjekten die dann in der Tabelle fragen gespeichert werden

ich versuche mal etwas zu bauen


----------



## Thallius (1. Feb 2017)

Wenn du es unbedingt so langsam wie möglich machen willst...

Join sind genau für deinen Anwendungsfall gemacht und wenn du dich da eingelesen hättest, was wir ja mittlerweile wissen das du das nicht so gerne machst, dann hättest du das auch erkannt.

Ich schreibe das hier nur, damit nicht andere die auf der Suche nach einer Lösung für das gleiche Problem diesen Thread hier finden glauben, dass die Lösungen die du benutzt wirklich gut sind.

Du kannst meinetwegen deinen Source weiter vergewaltigen wie du und willst...


----------



## didi577 (1. Feb 2017)

bin bei JOINs hängen geblieben und probiere es gerade aus, sieht im MySQL Command Line Client auch schon gut aus, muss es jetzt nur noch in den Code transferieren, in der Combobox wird noch nicht die richtige Tabellenspalte angzeigt 

als bekannter Codevergewaltiger habe ich auch eine Chance auf Resozialisierung, ich habe die letzten Tage viele Hinweise von euch implementiert und ne Menge dazu gelernt

ich bin halt Betriebswirt und outputorientiert, hier muss ich erst umdenken und lernen das der Input entscheidend ist


----------



## Tobse (1. Feb 2017)

didi577 hat gesagt.:


> ich bin halt Betriebswirt und outputorientiert, hier muss ich erst umdenken und lernen das der Input entscheidend ist


Die sind beide gleich wichtig. Der Output ist aber vom Input abhängig. Tust du scheisse rein, kommt 100% sicher scheisse raus. Aber nur weil du Gold rein tust, heisst das nicht, dass das auch wieder rauskommt.

Zum eigentlichen Thema: Meine Vorredner haben recht: JOINs sind auf genau diesen Anwendungsfall maßgeschneidert. Ich schlage vor, dass du zuerst die einzelnen Disziplinen lernst bevor du versuchst einen 10-Kampf zu gewinnen: beschäftige dich erstmal mit SQL und danach damit, wie du das in eine GUI eingebaut bekommst.

P.S.: Wenn einer meiner Arbeitskollegen Code abgiebt, in welchem manuell mit irgendwelchen IDs und Rohen Queries gearbeitet wird müsste er die Schmach der halben Abteilung über sich ergehen lassen. State-of-the-Art ist es, einen O/RM zu benutzen. In der Java-Welt ist das für relationale Datenbanken de-fakto Hibernate. Das ohne fundierte Kenntnisse von SQL einzusetzen ist aber sinnlos (daher ein Grund mehr, sich zuerst SQL genauer anzusehen). Aber bei der Programmierung von tatsächlichen Anwendungen ist es gegenüber rohen SQL Queries ein Unterschied wie Himmel und Erde.


----------



## didi577 (2. Feb 2017)

ja Danke die Metapher mit dem überforderten 10 Kämpfer ist sachlich richtig formuliert...und wenn ich hier mit dem Projekt fertig bin werde ich mich auch wieder mehr dem Lernen widmen

nichts desto trotz habe ich weiter gemacht und etwas erreicht, mit dem Aufruf:

```
mysql.ladenBoxDozent(
                   boxDozentM,
                   "select DISTINCT name from fragen join dozenten on dozent = dozent_id ORDER BY name");
```
erreiche ich das die Combobox Dozent mit den Namen und nicht den IDs gefüllt wird. Die Methoode sieht so aus:

```
public void ladenBoxDozent(DefaultComboBoxModel boxDozent, String sql) {

       PreparedStatement pst = null;
       ResultSet rs = null;

       try {
           pst = con.prepareStatement(sql);
           rs = pst.executeQuery();
           while (rs.next()) {
               boxDozent.addElement(rs.getString(1));
               System.out.println(rs.getString(1));
           }

       } catch (SQLException e) {
           e.printStackTrace();

       } finally {
           if (rs != null && pst != null) {
               try {
                   rs.close();
                   pst.close();
               } catch (SQLException e) {
                   e.printStackTrace();
               }
           }
       }
   }
```
nun möchte ich, dass eine weitere Combobox "Kurs" gefüllt wird, in Abhängigkeit der Combobox Dozent. Wenn ich in der Konsole den Befehl: select DISTINCT kursnr FROM fragen JOIN kurse ON kurs = kurs_id WHERE dozent="12" ORDER BY kursnr eingebe zeigt er mir das gewünschte Ergebnis. Alle kursnr des Dozenten 12 aus der Tabelle fragen. Aber ich übergebe ja nicht die DozentenID sondern das Ergebnis der Combobox Dozent. Der Aufruf sieht so aus:


```
"select DISTINCT kursnr FROM fragen JOIN kurse ON kurs = kurs_id WHERE dozent=? ORDER BY kursnr");
```
die Methode hierzu:


```
public void ladenBoxKurs(DefaultComboBoxModel boxDozentM,
           DefaultComboBoxModel boxKursM, String sql) {

       PreparedStatement pst = null;
       ResultSet rs = null;

       try {
           String dozent = boxDozentM.getSelectedItem().toString();
           pst = con.prepareStatement(sql);
           pst.setString(1, dozent);
           rs = pst.executeQuery();
           while (rs.next()) {
               boxKursM.addElement(rs.getString(1));
           }

       } catch (SQLException e) {
           e.printStackTrace();

       } finally {
           if (rs != null && pst != null) {
               try {
                   rs.close();
                   pst.close();
               } catch (SQLException e) {
                   e.printStackTrace();
               }
           }
       }
   }
```
Die Ausführung führt dazu dass die Box Dpzent richtig mit den Namen gefüllt wird aber die Box Kurs nicht. Ich gehe davon aus dass im Aufruf der Part 
	
	
	
	





```
WHERE dozent=?
```
 unvollständig ist. Das funktionierte nur als ich die Abfragen direkt über die Spaltenwerte aus der Tabelle fragen gemacht habe. Natürlich habe ich schon einiges aus verschiedenen SQL Tutorials gelesen und versucht aber kein gewünschtes Ergebnis bekommen. Kann mir jemand einen zielführenden Tipp geben?


----------



## Joose (2. Feb 2017)

Hier wieder das selbe Problem wie im vorherigen Thread (http://www.java-forum.org/thema/foreignkey-abfragen-und-speichern.176303/)
Anstatt die Dozenten Box nur mit dem Namen zu füllen, erstelle eine Klasse Dozent lade alle benötigten Daten und füge diese Dozent Objekte zum ComboBoxModel hinzu.
Beim Selektieren bekommst du dann wieder diese Objekt und kannst per getter Methode ganz einfach auf die ID zugreifen.


----------



## Harry Kane (2. Feb 2017)

didi577 hat gesagt.:


> und wenn ich hier mit dem Projekt fertig bin werde ich mich auch wieder mehr dem Lernen widmen


Da habe ich in einem von deinen früheren threads schon mal was zu gesagt.
Es ist nicht sinnvoll, zuerst getrieben von Aktionismus mit dem Kopf durch die Wand zu brechen und dann, wenn man durch ist, zu lernen, wie man Türen benutzt.


----------



## didi577 (2. Feb 2017)

ich verknüpfe das schon aber momentan nur in den Bereichen die mein Projekt direkt betreffen, ich muss aber an vielen Stellen nochmal an die Basics zurück und wiederholen


----------



## didi577 (2. Feb 2017)

didi577 hat gesagt.:


> nun möchte ich, dass eine weitere Combobox "Kurs" gefüllt wird, in Abhängigkeit der Combobox Dozent.


habe mir die Lösung erarbeitet 

```
"select DISTINCT kursnr, name FROM fragen INNER JOIN kurse ON kurs = kurs_id INNER JOIN dozenten ON dozent = dozent_id WHERE name=? ORDER BY kursnr");
```
da Java Proggis Estheten sind habe ich sauber INNER JOIN und nicht nur JOIN geschrieben


----------



## Meniskusschaden (2. Feb 2017)

Ich glaube, falls es einen Mathe-Professor Müller und auch einen Psychologie-Professor Müller gibt und man in der Combo-Box den Mathe-Müller wählt, würde man trotzdem nicht nur die Mathe- sondern auch die Psychologie-Kurse bekommen.


----------



## MattElg (4. Feb 2017)

Und hast Du die ResultSets einmal, dann kannst Du doch über das ResultSet getColumnName die Namen der Spalten.
rs.getColumnName(i)  - gibt den Namen der Spalten i
Also musst Du faktisch nur die Daten deiner Angaben per Select, meinetwegen auch per Join abfragen und schon hast Du auch die Spaltennamen, wenn ich es richtig verstand.


----------

