2016-07-24 5 views
0

В моем приложении Android у меня есть база данных Sqlite с таблицей вопросов с 6 идентификаторами темы. Теперь я хочу получить определенное количество вопросов по каждой теме. Это означает: 15 вопросов с темой-идентификатором 1, 5 с темой-идентификатором 2, 7 с темой-идентификатором 3 и 4 и 3 с темой-идентификатором 5 и 6.Sqlite - Несколько INNER JOIN на одной таблице с лимитом

Мне кажется, мне нужно соединение с несколькими соединениями и но я не знаю много о построении запросов, подобных этому.

Есть ли у вас идеи?

ответ

2

Простой способ заключается в использовании union all и limit:

(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) ; 

Я не понимал, что SQLite, кажется, есть проблемы с подзапросов и union all. В любом случае, эта версия кажется, 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

Благодарности , но я получаю синтаксическую ошибку SQL, когда я использую ваш запрос. –

+0

И какова будет ошибка? –

+0

Подзапросы разрешены как есть, только там, где разрешено имя таблицы (в предложении FROM) или в виде скалярного подзапроса. UNION хочет «реальный» запрос, поэтому вам придется обернуть вокруг него другой запрос. –

0

Объединяют строки из Mutiple запросов используйте compound query.

LIMIT не допускаются запрос в составном запросе, поэтому он должен быть перемещен в подзапрос:

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

Когда я использую ваш запрос, я получаю также синтаксическую ошибку SQL. –

+0

Окончательный ORDER BY не работает без отдельной ссылки, но вы не просили об этом ... –

Смежные вопросы