Korrekte Vorgehensweise bei UNION -Queries

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Basti909851, 04.11.2010.

  1. Basti909851, 04.11.2010 #1
    Basti909851

    Basti909851 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    63
    Erhaltene Danke:
    4
    Registriert seit:
    06.09.2010
    Hallo Community,

    ich wende mich nochmal an Euch. Ich experementiere nun seit ein paar Tagen mit dem Quellcode rum und kriege es einfach nicht auf die Reihe... Ich habe folgende Tabellenstruktur:

    Code:
    CREATE TABLE questions_light (_questionid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, question_mark TEXT, right_answer TINYINT, answer1 TEXT, answer2 TEXT, answer3 TEXT, answer4 TEXT);
    CREATE TABLE questions_medium (_questionid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, question_mark TEXT, right_answer TINYINT, answer1 TEXT, answer2 TEXT, answer3 TEXT, answer4 TEXT);
    CREATE TABLE questions_hard (_questionid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, question_mark TEXT, right_answer TINYINT, answer1 TEXT, answer2 TEXT, answer3 TEXT, answer4 TEXT);
    Nun möchte ich aus diesen Tabellen jeweils fünf zufällige Datensätze auslesen. Dazu hatte ich mir folgendes Statement einfallen lassen:

    Code:
    (SELECT * FROM questions_light ORDER BY RAND() LIMIT 5)
    UNION
    (SELECT * FROM questions_medium ORDER BY RAND() LIMIT 5)
    UNION
    (SELECT * FROM questions_hard ORDER BY RAND() LIMIT 5);
    Und wollte dies mir der rawQuery() Methode absetzen. Allerdings scheint es mir, dass Android die öffnende Klammer am Anfang des Queries nicht akzeptiert. Wenn ich die Klammern weglasse, klappt das mit den Limits nicht mehr und wenn ich das Limit ans Ende setze, wendet er es natürlich auf das UNION-Result an, was ich auch nicht will. Dann stieß ich auf die buildUnionQuery() Methode. Dort scheint es mit meinen Limits aber auch nicht zu klappen, oder übersehe ich da was?

    Hat da jemand eine Lösung? Oder gehe ich völlig falsch an das Problem heran?
     
  2. realgun, 04.11.2010 #2
    realgun

    realgun Android-Hilfe.de Mitglied

    Beiträge:
    94
    Erhaltene Danke:
    3
    Registriert seit:
    14.04.2010
    Hast Du es schon damit versucht:
    Code:
    SELECT * FROM(
      (SELECT * FROM questions_light ORDER BY RAND() LIMIT 5)
       UNION 
      (SELECT * FROM questions_medium ORDER BY RAND() LIMIT 5) 
       UNION 
      (SELECT * FROM questions_hard ORDER BY RAND() LIMIT 5)
    );
    
    (eventuell mit Alias am Ende)
     
  3. Basti909851, 04.11.2010 #3
    Basti909851

    Basti909851 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    63
    Erhaltene Danke:
    4
    Registriert seit:
    06.09.2010
    Ich habe es nun mal mit folgendem versucht:

    Code:
    SELECT * FROM ((SELECT question_mark,right_answer,answer1,answer2,answer3,answer4 FROM questions_light  ORDER BY RAND() LIMIT 5) UNION (SELECT question_mark,right_answer,answer1,answer2,answer3,answer4 FROM questions_medium  ORDER BY RAND() LIMIT 5) UNION (SELECT question_mark,right_answer,answer1,answer2,answer3,answer4 FROM questions_light  ORDER BY RAND() LIMIT 5)) AS d
    Da sagt er mir:

    Wenn ich diesen Query auf meiner mySQL Datenbank im Web (phpmyadmin) ausführe, erhalte ich das perfekt gewünschte Ergebnis. Wieso funktioniert das mit Android nicht? An dem Union ist doch nichts falsch...
     
  4. DieGoldeneMitte, 04.11.2010 #4
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    SQL ist eben leider nicht gleich SQL. Und sqlite trägt das lite im Namen leider zurecht:

    SQLite Query Language: SELECT
     
  5. Basti909851, 04.11.2010 #5
    Basti909851

    Basti909851 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    63
    Erhaltene Danke:
    4
    Registriert seit:
    06.09.2010
    Oh, herje... Das heißt mein Vorhaben ist mit SQLite gar nicht möglich?! Das ist natürlich ärgerlich... Dann muss ich wohl meine Tabellenstruktur überdenken...
     
  6. ts-apps, 04.11.2010 #6
    ts-apps

    ts-apps Erfahrener Benutzer

    Beiträge:
    194
    Erhaltene Danke:
    39
    Registriert seit:
    27.03.2010
    Öhm was spricht gegen 3 separate Abfragen?
     
  7. Basti909851, 05.11.2010 #7
    Basti909851

    Basti909851 Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    63
    Erhaltene Danke:
    4
    Registriert seit:
    06.09.2010
    Ich hätte gerne nur ein Cursorobjekt... Kann ich die (drei) denn irgendwie klug überführen, ohne da irgendwie so wilde Konstrukte mit Arrays bauen zu müssen?
     
    Zuletzt bearbeitet: 05.11.2010

Diese Seite empfehlen