1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Datenbank-Abfrage: 2 Werte aus unterschiedlichen Tabellen

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Garnet, 05.07.2012.

  1. Garnet, 05.07.2012 #1
    Garnet

    Garnet Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    71
    Erhaltene Danke:
    1
    Registriert seit:
    21.05.2012
    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.
     
  2. swordi, 05.07.2012 #2
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    das ginge zb so:

    select sprecher_id from sprecherzuordnung, vortrag where sprecherzuordnung.vortragID = vortrag.vortrag_id AND tag = montag
     
    Garnet bedankt sich.
  3. Garnet, 05.07.2012 #3
    Garnet

    Garnet Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    71
    Erhaltene Danke:
    1
    Registriert seit:
    21.05.2012
    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?
     
  4. Tom299, 06.07.2012 #4
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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
     
  5. Garnet, 06.07.2012 #5
    Garnet

    Garnet Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    71
    Erhaltene Danke:
    1
    Registriert seit:
    21.05.2012
    Danek Tom, nur leider bekomm ich da schon wieder die Exception "bind or column index out of range". :-(
     
  6. Thyrion, 06.07.2012 #6
    Thyrion

    Thyrion Ehrenmitglied

    Beiträge:
    11,849
    Erhaltene Danke:
    2,452
    Registriert seit:
    21.07.2009
    Phone:
    Nexus 5X
    Du übergibst dem rawQuery() einen Parameter (new String[] ...) aber es gibt keinen Platzhalter im SQL-Query, wo dieser eingesetzt werden kann/soll.
     
  7. Tom299, 06.07.2012 #7
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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?
     
  8. Garnet, 06.07.2012 #8
    Garnet

    Garnet Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    71
    Erhaltene Danke:
    1
    Registriert seit:
    21.05.2012
    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]
     
  9. Thyrion, 06.07.2012 #9
    Thyrion

    Thyrion Ehrenmitglied

    Beiträge:
    11,849
    Erhaltene Danke:
    2,452
    Registriert seit:
    21.07.2009
    Phone:
    Nexus 5X
    s.o.
     
    Garnet bedankt sich.
  10. Garnet, 06.07.2012 #10
    Garnet

    Garnet Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    71
    Erhaltene Danke:
    1
    Registriert seit:
    21.05.2012
    Ok, jetzt hab ichs gesehen, danke Thyrion. Aber was muss jetzt in das new String[] {...} genau rein? Steh da grade irgendwie auf dem Schlauch.
     
  11. Thyrion, 06.07.2012 #11
    Thyrion

    Thyrion Ehrenmitglied

    Beiträge:
    11,849
    Erhaltene Danke:
    2,452
    Registriert seit:
    21.07.2009
    Phone:
    Nexus 5X
    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: 06.07.2012
  12. Garnet, 06.07.2012 #12
    Garnet

    Garnet Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    71
    Erhaltene Danke:
    1
    Registriert seit:
    21.05.2012
    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.
     
  13. Thyrion, 06.07.2012 #13
    Thyrion

    Thyrion Ehrenmitglied

    Beiträge:
    11,849
    Erhaltene Danke:
    2,452
    Registriert seit:
    21.07.2009
    Phone:
    Nexus 5X
    Na dann mach doch genau das :smile:

    PHP:
    SELECT v.Vortragstitels.Sprechername
    FROM Vortrag v
    Sprecher sSprecherzuordnung 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:
     
  14. Garnet, 06.07.2012 #14
    Garnet

    Garnet Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    71
    Erhaltene Danke:
    1
    Registriert seit:
    21.05.2012
    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.
     

Diese Seite empfehlen