2016-07-24 9 views
0

In meiner Android-Anwendung habe ich eine Sqlite-Datenbank mit einer Fragetabelle mit 6 Themen-IDs. Jetzt möchte ich eine bestimmte Anzahl von Fragen zu jedem Thema bekommen. Das heißt: 15 Fragen mit Topic-ID 1, 5 mit Topic-ID 2, 7 mit Topic-ID 3 und 4 und 3 mit Topic-ID 5 und 6.Sqlite - Mehrere INNER JOIN am selben Tisch mit Limit

Ich denke, ich brauche eine multiple innere Verbindung und die Limit-Funktion, aber ich weiß nicht viel über das Erstellen von Abfragen wie folgt.

Haben Sie irgendwelche Ideen?

Antwort

2

Eine einfache Methode ist union all und limit zu verwenden:

(select q.* from questions q where q.topicid = 1 order by random() limit 15) union all 
(select q.* from questions q where q.topicid = 2 order by random() limit 5) union all 
(select q.* from questions q where q.topicid in (3, 4) order by random() limit 7) union all 
(select q.* from questions q where q.topicid in (5, 6) order by random() limit 3) ; 

Ich wusste nicht, dass SQLite Probleme mit Unterabfragen und union all zu haben scheint. Auf jeden Fall scheint diese Version zu work:

with q1 as 
    (select q.* from questions q where q.topicid = 1 order by random() limit 15), 
    q2 as 
    (select q.* from questions q where q.topicid = 2 order by random() limit 5), 
    q34 as 
    (select q.* from questions q where q.topicid in (3, 4) order by random() limit 7), 
    q56 as 
    (select q.* from questions q where q.topicid in (5, 6) order by random() limit 3) 
select * from q1 union all 
select * from q2 union all 
select * from q34 union all 
select * from q56; 
+0

Dank , aber ich erhalte einen SQL-Syntaxfehler, wenn ich Ihre Abfrage verwende. –

+0

Und was wäre der Fehler? –

+0

Unterabfragen sind nur dann zulässig, wenn ein Tabellenname zulässig ist (in der FROM-Klausel) oder als skalare Unterabfrage. UNION möchte eine "echte" Abfrage, also müssen Sie eine weitere Abfrage um es herum wickeln. –

0

Um Zeilen aus mutiple Abfragen verketten, eine compound query verwenden.

LIMIT nicht auf einer Abfrage in einer Verbindung Abfrage erlaubt ist, so hat sie in eine Unterabfrage bewegt werden:

SELECT * FROM (SELECT * FROM Questions 
       WHERE TopicID = 1 
       ORDER BY random() LIMIT 15) 
UNION ALL 
SELECT * FROM (SELECT * FROM Questions 
       WHERE TopicID = 2 
       ORDER BY random() LIMIT 5) 
UNION ALL 
... 
+0

Wenn ich Ihre Abfrage verwende, erhalte ich auch einen SQL-Syntaxfehler. –

+0

Das letzte ORDER BY funktioniert nicht ohne eine separate Indirektion, aber Sie haben nicht danach gefragt ... –