# Sortieralgorithmus für MySQL-Datenbanken.



## skorpion130 (4. Dez 2010)

Hallo zusammen,
vor mir liegt folgende Aufgabe. Ich soll aus einer Datenbank zwei Tabellen auslesen. Zu dem Zeitpunkt interessieren mich nur die Spalten mit den BenutzerIDs. Diese soll ich mit java auslesen, aufsteigend sortieren und ausgeben.
Die Verbindung zur Datenbank habe ich. Ich habe auch schon das Zusammenlegen der Einträgen in einem Array zusammengepackt. Das soriteren klappt aber nicht 100%, obwohl Arrays.sort() der richtige Befehl dazu sein sollte. Ich finde leider kein Fehler in der Code:

```
// --- Daten auslesen
		try {
		ResultSet answerTable;
		ResultSet questionTable;
		String sQuestionid, sAskerid, sMember, sAnswererid;
		String[] member= new String[100]; //muss bei größeren Datensätzen angepasst werden
		
		//ResultSetMetaData answerTableMS;
		
		answerTable = orderA.executeQuery( "SELECT DISTINCT answererid FROM cen.answer ORDER BY answererid " );		
		questionTable = orderQ.executeQuery( "SELECT DISTINCT askerid FROM cen.question ORDER BY askerid" );
		
		int i = 0;
		int j = 0;
//nun werden die IDs aus einer Tabelle in ein Array gepackt
		while( answerTable.next() ) {
			i++;		
			member[j] = answerTable.getString( "answererid" );
			j++;
		//System.out.println(sId + ": " + "\t"  + sQuestionid + "\t" + sAnswererid);
		}
//nun aus der zweiter Tabelle in das selbe Array
		i = 0;
		while( questionTable.next() ) {
			i++;
			member[j] = questionTable.getString("askerid");
			j++;   
			}

		//nächster Schritt sollte doppelte Einträge eliminieren
		HashSet<String> strings = new HashSet<String>();
		for (int k = 0; member[k] != null; k++) {
		    strings.add(member[k]);
		}
		member = strings.toArray(new String[0]); //String wieder in Array umwandeln
		
		Arrays.sort(member);
		
		
		System.out.println("*Vertices");		
		for (int m=0;m < member.length; m++){
			System.out.println("KnotenID" + member[m]);
			}
		System.out.println("ENDE");
		verbindung.close();
		} catch( Exception e ) {
		e.printStackTrace();
		}
		// --- Daten auslesen
```

die Code gibt raus:
1
2
21
22
3
Wieso werden die Zahlen im Array erst nach dem ersten Zeichen sortiert? Ich habe mehrere hinweise gefunden, dass auch ein String[] damit problemlos sortiert werden kann. Ein Int[] kann ich leider nicht verwenden, da ich von Query ein String bekomme und kann nicht in int umwandeln.War meine Vorüberlegund überhaupt richtig, ein Array dazu zu verwenden oder gibt es eine elegantere Lösung?
P/S was mich bei der Lösung noch stört, dass ich dem Array schon am Anfang einen Wert zuweisen muss, wobei die Anzahl der Benutzer auch wachsen könnte. Nur weiß ich nicht, wie ich das anders lösen könnte.


----------



## XHelp (4. Dez 2010)

Es sind ja auch Strings die du sortierst und Strings werden lexikographisch sortiert.
Du musst also Integer (o.ä.) verwenden.
Aber du bekommst ja schon die Werte von der Datenbank sortiert zurück, wozu also noch mal sortieren?


----------



## diel2001 (4. Dez 2010)

Strings werden nachdem ihrem ASCII code sortiert und es fängt beim ersten Zeichen an 
1
12
2
23

Wenn es nur Zahlen sind, kannst du es doch zu einem Integer machen und dann sortieren


----------



## skorpion130 (4. Dez 2010)

danke erst mal für die Antworten nur die Vorschläge kann bei dem Beispiel leider nicht anwenden. 
@XHelp
Das ein String so sortiert wird, ist mir nun klar. Ein Int-Array kann ich wegen dem String-Input nicht verwenden.
zur Sortierung:
ich bekomme sie zwar schon einzeln sortiert, nur es ist nicht ausgeschlossen, dass Benutzer gibt, die nur in einer der Tabelle vorkommen. Zum Beispiel, einer hat nur Fragen gestellt, aber noch nie eine selbst beantwortet. Aus meiner Aufgabenstellung habe ich keine dritte Tabelle mit Userdaten. Deswegen muss ich sie aus den beiden Tabellen auslesen und daher danach sortieren.


----------



## XHelp (4. Dez 2010)

JOIN drumherumschrauben und dann mit einer Query auslesen.
Wenn das Strings sind, dann ist das die richtige Reihenfolge. Wenn du die wie Zahlen sortieren willst, dann dürfen keine Buchstaben auftauchen.
Notfalls musst du dir einen eigenen Comparator schreiben.


----------



## skorpion130 (4. Dez 2010)

die Variante mit dem Join wäre hier sicherlich gute Lösung. Das hätte mir in Java eine Menge Arbeit gespart. Ich konnte bis jetzt keine Beispiele finden, wie ich nur mit einem Query aus zwei Tabellen zwei Spalten raus lesen, in eine Spalte zusammen fügen, Doppeleinträge eliminieren und dann sortieren kann. Könntest du mir da helfen?
ich suche in dieser Zeit nach "was ist Comparator" und weiteren Join-Abfragen 

P/S Die BenutzerIDs können nur Zahlen sein, nur Java bekommt die Zahlen trotzdem als String


----------



## XHelp (4. Dez 2010)

skorpion130 hat gesagt.:


> Könntest du mir da helfen?


Beschreib mal wie die Tabellen aussehen, und was genau du da machen willst und welche Einträge du haben willst und welche nicht, dann lässt sich bestimmt irgendein Beispiel finden.


> P/S Die BenutzerIDs können nur Zahlen sein, nur Java bekommt die Zahlen trotzdem als String



Dann könntest du ja einfach statt 
	
	
	
	





```
getString
```
 auch 
	
	
	
	





```
getInt
```
 aufrufen und schon bekommst du eine Zahl zurück.


----------



## skorpion130 (4. Dez 2010)

Datenbank: cen
vereinfachte Tabellen:
answer


questionid|answererid|answer
zahl|zahl|stringquestion


quesitionid|askerid|
zahl|zahl


----------



## XHelp (4. Dez 2010)

Und was willst du jetzt machen?


----------



## skorpion130 (4. Dez 2010)

XHelp hat gesagt.:


> Dann könntest du ja einfach statt
> 
> 
> 
> ...



Stimmt, oh man, ich dachte, es geht nur mit string. Nun wird auch korrekt sortiert. Bleibt dann jetzt nur die doppelte Einträgen anders löschen, aber das packe ich schon selber.

Den Dank hast verdient  Was mich aber trotzdem sehr interessiert, wie ich bei einer Datenbankabfrage das auf einmal abfragen könnte und mir das nächste mal die Arbeit sparen.

Also ich habe diese beide Tabelle, die ich schon zufällig befüllt habe. Ich will nun aus diesen beiden Tabelle alle Mitglieder rausfinden, die schon mal eine Frage oder Antwort gepostet haben. Danach sollen sie sortiert und höchstens einmal mit Java ausgegeben werden.


----------



## XHelp (4. Dez 2010)

Du willst also alle answererid UND alle askerid, aber jeden eintrag höhstens 1 mal? Dann kannst du auch zunächst mit UNION deine beiden Abfragen verbinden und dann noch mal DISTINCT machen.


----------



## skorpion130 (4. Dez 2010)

hat funktioniert 
[SQL=5](SELECT answererid FROM cen.answer) UNION (SELECT askerid FROM cen.question)ORDER BY answererid[/code]

schon ärgerlich, 10 Minuten und ein zufrieden stellender Ergebnis. Gestern wollte ich es noch mit eigenen Kräften lösen und für die andere Lösung über 5 Stunden gebraucht.

Danke euch nochmals. Das Thema lasse ich noch kurz offen, da ich noch ein zweites Teil der Aufgabe lösen muss. Das Probiere ich nun mit den SQL-Abfragen zu lösen.:rtfm:


----------

