Korrekte Vorgehensweise bei UNION -Queries

B

Basti909851

Ambitioniertes Mitglied
4
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?
 
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)
 
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:

w11-04 19:13:12.389: INFO/Database(378): sqlite returned: error code = 1, msg = near "UNION": syntax error

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...
 
SQL ist eben leider nicht gleich SQL. Und sqlite trägt das lite im Namen leider zurecht:

SQLite Query Language: SELECT
Two or more simple SELECT statements may be connected together to form a compound SELECT using the UNION, UNION ALL, INTERSECT or EXCEPT operator. In a compound SELECT, all the constituent SELECTs must return the same number of result columns. As the components of a compound SELECT must be simple SELECT statements, they may not contain ORDER BY or LIMIT clauses. ORDER BY and LIMIT clauses may only occur at the end of the entire compound SELECT.
 
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...
 
Öhm was spricht gegen 3 separate Abfragen?
 
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:

Ähnliche Themen

D
Antworten
17
Aufrufe
396
datNeMo
D
M
Antworten
3
Aufrufe
146
moin
M
Y
Antworten
4
Aufrufe
1.211
swa00
swa00
Zurück
Oben Unten