SQLite - сложные запросы - PullRequest
2 голосов
/ 26 апреля 2009

Я получаю случайную строку из моей таблицы, используя следующий запрос:

SELECT value_id FROM table1 ORDER BY RANDOM() LIMIT 1

У меня есть 3 таблицы: table1 и table2 - это таблицы, которые имеют идентификатор строки и ее значение. кроме того, в таблице table3 есть идентификаторы строк в таблицах table1 и table2.

т.е. :

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 в результате.

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

Заранее спасибо.

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

Ответы [ 4 ]

2 голосов
/ 26 апреля 2009

Вы не сказали нам, как называются поля в 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
1 голос
/ 26 апреля 2009

Order by Random () означает, что он будет случайным образом упорядочен по другому столбцу.

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

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

не знаю имя столбца2, поэтому я назвал его second_value

0 голосов
/ 27 апреля 2009
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".

0 голосов
/ 26 апреля 2009

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

SELECT f1 FROM table
 WHERE f2 IS NOT NULL
ORDER BY RANDOM() LIMIT 1; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...