2009-04-26 2 views
2

Я получаю случайную строку из моей таблицы с помощью следующего запроса:SQLite - сложных запросов

SELECT value_id FROM table1 ORDER BY RANDOM() LIMIT 1 

У меня есть 3 таблицы: table1 и таблица2 - они представляют собой таблицы, которые имеют идентификатор строки и его значение , также есть таблица3, которая имеет в качестве столбцов идентификаторы строк в таблице 1 и таблице2.

т.е.:

table1: 
1 - Canada 
2 - USA 
3 - UK 
4 - France 
5 - Africa 
6 - China 

table2: 
1 - New York 
2 - Vancouver 
3 - Paris 
4 - London 
5 - Ottawa 
6 - Los Angeles 

table3: (without table3 rowid) 
1 - 2 
1 - 5 
2 - 1 
2 - 6 
3 - 4 
4 - 3 

Так из таблицы 3 можно сказать, что Нью-Йорк это город в США, и так далее. А также в таблице 3 я могу иметь неопределенные значения. (В примере они - Африка и Китай, поэтому я не хочу получать их в результате)

Что я хочу сделать, это получить из случайных идентификаторов таблицы1, но только те, которые определены в таблице3. В этом конкретном случае я не хочу получать 5 и 6 в результате.

Как я могу переписать свой запрос для достижения своей цели?

Благодарим вас заблаговременно.

Редактировать: Проблема заключается в том, что когда я пытаюсь получить строку, строка которой в таблице3 не определена, приложение cruses. Это не NULL, как я писал ранее, он просто не существует в таблице3. Как я могу переписать запрос для правильной обработки моего дела?

ответ

2

Вы не сказали нам, как поля в table3 названы, но предположим, что, например, они называются tab1_id и tab2_id с очевидными значениями, попробуйте:

SELECT table1.value_id 
FROM table1 INNER JOIN table3 ON table1.value_id=table3.tab1_id 
WHERE table3.tab2_id IS NOT NULL 
ORDER BY RANDOM() LIMIT 1 
+0

заказ by random() = order by table1.value_id – Mash

+0

Спасибо, это то, что мне нужно. И если у меня нет значения, определенного в таблице 3, как убедиться, что я не получу этот результат в моем запросе? –

+0

Это НЕ, что вам нужно - вам нужна случайная ROW, а не случайная COLUMN? Я ответил ниже с помощью соответствующего SQL. – Mash

0

Не вопрос SQLite, а общая проблема SQL. Вы хотите проверить значение NULL в значениях полей, например.

SELECT f1 FROM table 
WHERE f2 IS NOT NULL 
ORDER BY RANDOM() LIMIT 1; 
+0

Order by Random() означает, что он будет произвольно заказывать другой столбец. – Mash

1

Сортировать по Random () означает, что он будет произвольно упорядочиваться по другому столбцу.

Используйте это:

SELECT value_id FROM table3 
    WHERE rowid>=random() % (SELECT max(rowid) FROM table3) 
    AND second_value IS NOT NULL 
    LIMIT 1; 

не знаю имя COLUMN2, поэтому я назвал его SECOND_VALUE

0
SELECT rowid FROM table1 
WHERE rowid IN (SELECT DISTINCT table1_id FROM table3) 
ORDER BY RANDOM() LIMIT 1; 

Этот запрос означает «выбрать в случайном порядке ряд из table1, который имеет запись в table3 ".

Каждая строка в таблице1 равна вероятности того, что она выбрана (DISTINCT), если она указана хотя бы один раз в table3.

Если вы пытаетесь получить ВСЕ столбцы таблицы 1, которые находятся в таблице 3, вам следует удалить предложение «ORDER BY RANDOM() LIMIT 1».

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