Datenbank-Abfrage: 2 Werte aus unterschiedlichen Tabellen

G

Garnet

Ambitioniertes Mitglied
1
Hi,
ich kenn mich mit sqlite Datenbanken leider nicht so gut aus und hoffe, dass mir hier einer weiterhelfen kann.

Ich habe folgende Tabellen:
Tabelle Sprecher: SprecherID, Sprechername..
Tabelle Vortrag: VortragID, Vortragtitel, Tag...
Tabelle Sprecherzuordnung: SprecherID, VortragID

Meine erste Abfrage ist:
"SELECT Sprecher_ID "+"FROM Sprecherzuordnung "+"WHERE Vortrag_ID = ? "

Jetzt würde ich gerne eine Abfrage machen, die nur die Sprechernamen auswählt, bei denen der Vortrag am Montag stattfindet. also WHERE Tag = Montag ist.
 
das ginge zb so:

select sprecher_id from sprecherzuordnung, vortrag where sprecherzuordnung.vortragID = vortrag.vortrag_id AND tag = montag
 
  • Danke
Reaktionen: Garnet
Vielen Dank!
Jetzt bekomme ich nur eine blöde Exception: "bind or column index out of range". :-(
Die Abfrage:
cur2 = StartseiteActivity.​
appDB2.rawQuery("SELECT Sprecher_ID "+"FROM Sprecherzuordnung, Vortrag "+"WHERE Sprecherzuordnung.Vortrag_ID = Vortrag.Vortrag_ID AND Tag = 'Montag'",

new String[] {sprecherID});

Müsste ich da jetzt nicht noch den Sprechernamen einbauen, der ist bei der Abfrage ja gar nicht drin?
 
Code:
select Sprechername from Sprecher as sp, Vortrag as v, Sprecherzuordnung as z 
where Tag = 'Montag' 
and v.VortragID = z.VortragID
and sp.SprecherID = z.SprecherID

das müßte gehen
 
Danek Tom, nur leider bekomm ich da schon wieder die Exception "bind or column index out of range". :-(
 
Du übergibst dem rawQuery() einen Parameter (new String[] ...) aber es gibt keinen Platzhalter im SQL-Query, wo dieser eingesetzt werden kann/soll.
 
Ohne Code kann man schlecht was sagen ... setz den Befehl mal in deinem SQL-Manager ab, wenn das funktioniert liegts am Code ;-)

Hast du auch cursor.moveToFirst() gemacht?
 
Also wenn ich die Abfrage in meinem SQL-Manager ausführen will, stürzt er ab.^^'''

cursor.moveToFirst() hab ich gemacht.

Hier ist mal mein Code von Anfang an:

Code:
[LEFT][SIZE=2][COLOR=#3f7f5f][SIZE=2][COLOR=#3f7f5f]//[U]Befüllen[/U] [U]der[/U] ListView myListing[/COLOR][/SIZE]
[/COLOR][/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]for[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] ([/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]int[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] i=1; i<=anzahl; i++) [/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2][U]HashMap[/U] item = [/SIZE][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] [U]HashMap[/U]();[/SIZE]
[B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]int[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] spaltenindex = 0;[/SIZE]
[SIZE=2]String vortragstitel=[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]""[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2]String uhrzeit=[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]""[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2]String s = Integer.[I]toString[/I](i);[/SIZE]
[SIZE=2]cur = StartseiteActivity.[/SIZE][I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]appDB2[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2].rawQuery([/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"SELECT Vortragstitel "[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]+[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"FROM Vortrag "[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]+[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"WHERE Vortrag_ID = ? AND Tag = 'Montag'"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE]
[B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] String[] {s});[/SIZE][/LEFT]
 
[LEFT][SIZE=2][COLOR=#3f7f5f][SIZE=2][COLOR=#3f7f5f]//[U]Spalte[/U] [U]Vortragstitel[/U] [U]aus[/U] [U]dem[/U] [U]Abfrageergebnis[/U] [U]wird[/U] [U]ausgewählt[/U][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#3f7f5f][/LEFT]

[/COLOR][/SIZE][SIZE=2]spaltenindex = cur.getColumnIndex(
[/SIZE][LEFT][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"Vortragstitel"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]);[/SIZE]
[LEFT][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]if[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2](cur.getCount() > 0)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2]cur.moveToFirst();[/SIZE]
[SIZE=2]vortragstitel = cur.getString(spaltenindex); [/SIZE]
[SIZE=2][U]item.put([/U][/SIZE][U][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"line1"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], vortragstitel )[/SIZE][/U][SIZE=2];[/SIZE]
[SIZE=2]}[/SIZE][/LEFT]
 
 
[LEFT][SIZE=2]String sprecherID =[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]""[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2]String sprechername =[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]""[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2];[/SIZE][/LEFT]
 
[LEFT][SIZE=2]cur = StartseiteActivity.[/SIZE][I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]appDB2[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2].rawQuery([/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"SELECT Sprecher_ID "[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]+[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"FROM Sprecherzuordnung "[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]+[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"WHERE Vortrag_ID = ? "[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE]
[B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] String[] {s});[/SIZE][/LEFT]
 
[LEFT][SIZE=2]spaltenindex = cur.getColumnIndex([/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"Sprecher_ID"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]);[/SIZE][/LEFT]
 
[LEFT][B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]if[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2](cur.getCount() > 0)[/SIZE]
[SIZE=2]{[/SIZE]
[SIZE=2]cur.moveToFirst();[/SIZE]
[SIZE=2]sprecherID = cur.getString(spaltenindex); [/SIZE][/LEFT]
 
[LEFT][SIZE=2]Cursor cur2;[/SIZE]
[SIZE=2]cur2 = StartseiteActivity.[/SIZE][I][SIZE=2][COLOR=#0000c0][SIZE=2][COLOR=#0000c0]appDB2[/COLOR][/SIZE][/COLOR][/SIZE][/I][SIZE=2].rawQuery([/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"SELECT Sprechername "[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]+[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"FROM Sprecher AS sp, Vortrag AS v, Sprecherzuordnung AS z "[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]+[/SIZE][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"WHERE Tag = 'Montag' AND v.Vortrag_ID = z.Vortrag_ID AND sp.Sprecher_ID = z.Sprecher_ID"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], [/SIZE]
[B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]new[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] String[] {sprecherID});[/SIZE]
[B][SIZE=2][COLOR=#7f0055][SIZE=2][COLOR=#7f0055]int[/COLOR][/SIZE][/COLOR][/SIZE][/B][SIZE=2] spaltenindex2 = 0;[/SIZE]
[SIZE=2][COLOR=#3f7f5f][SIZE=2][COLOR=#3f7f5f]//[U]Spalte[/U] [U]Sprechername[/U] [U]aus[/U] [U]dem[/U] [U]Abfrageergebnis[/U] [U]wird[/U] [U]ausgewählt[/U][/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2][COLOR=#3f7f5f]
[/COLOR][/SIZE][SIZE=2]spaltenindex2 = cur2.getColumnIndex([/LEFT]
[/LEFT]
[/SIZE][LEFT][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"Sprechername"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2]);[/SIZE]
[LEFT][SIZE=2]cur2.moveToFirst();[/SIZE]
[SIZE=2]sprechername = cur2.getString(spaltenindex2);[/SIZE][/LEFT]
[SIZE=2][U]item.put([/U][/SIZE][U][SIZE=2][COLOR=#2a00ff][SIZE=2][COLOR=#2a00ff]"line2"[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=2], sprechername )[/SIZE][/U][SIZE=2];[/SIZE]

Die ersten beiden Abfragen funktionieren, nur eben diese nicht. :-(

[/LEFT]
 
s.o.
 
  • Danke
Reaktionen: Garnet
Ok, jetzt hab ichs gesehen, danke Thyrion. Aber was muss jetzt in das new String[] {...} genau rein? Steh da grade irgendwie auf dem Schlauch.
 
Wenn du keinen Parameter in dem SQL brauchst, versuch es doch mal mit null.

EDIT: rawQuery("SELECT ... bla", null);

EDIT 2: Ich vermute aber, du möchtest das ganze auf einen bestimmten Sprecher (nämlich den, den du vorher selektierst) einschränken und nicht die gesamte Tabelle zurückgeben. Demnach musst du das Select-Statement noch um die Bedingung erweitern. Damit dürfte das so aussehen:
PHP:
cur2 = StartseiteActivity.appDB2.rawQuery("SELECT Sprechername FROM Sprecher AS sp, Vortrag AS v, Sprecherzuordnung AS z WHERE Tag = 'Montag' AND v.Vortrag_ID = z.Vortrag_ID AND sp.Sprecher_ID = z.Sprecher_ID AND z.Sprecher_ID = ?", new String[] {sprecherID});


EDIT 3: Wieso eigentlich nicht alles in einem SELECT? (Das dürfte deutlich performanter sein)
 
Zuletzt bearbeitet:
Also mit null klappt es leider auch nicht. Da zeigt er mir in der ganzen Liste den gleichen Sprechernamen an.
Also ich will eigentlich nur, dass meine Liste mit den Sprechern befüllt wird, die an dem Tag Montag z.B. einen Vortrag halten. Es sollen dann in der Liste immer Vortagstitel und der dazugehörige Sprechername angezeigt werden.

Gern auch alles in einem Select, wie gesagt, tu ich mich noch etwas schwer mit dem ganzen Datenbankkram.
 
Na dann mach doch genau das :smile:

PHP:
SELECT v.Vortragstitel, s.Sprechername
FROM Vortrag v, Sprecher s, Sprecherzuordnung sz 
WHERE
	s.SprecherID = sz.SprecherID
	AND v.VortragID = sz.VortragID
	AND v.Tag = ?
Und "Montag" dann als Parameter übergeben.

EDIT: Das hat aber Tom299 im Prinzip auch schon geschrieben :lol:
 
Ok, also ich stell mich wahrscheinlich grade ziemlich doof an.

Ich hab es jetzt nochmal mit deiner Abfrage versucht, da ist aber wieder das Problem, dass er mir immer den gleichen Sprecher anzeigt bei jedem Listeneintrag.
 

Ähnliche Themen

5
Antworten
22
Aufrufe
1.412
590239
5
R
  • RalfKahl
Antworten
10
Aufrufe
285
RalfKahl
R
S
Antworten
33
Aufrufe
2.655
Sempervivum
S
Zurück
Oben Unten