SQLite - 复杂的查询

时间:2009-04-26 17:58:59

标签: sqlite

我使用以下查询从表中获取随机行:

SELECT value_id FROM table1 ORDER BY RANDOM() LIMIT 1

我有3张桌子: table1和table2 - 它们是具有行的id及其值的表。 还有table3,其table1和table2中包含行ID列。

即。 :

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中我可以有未定义的值。 (在这个例子中,他们是非洲和中国所以我不想让他们得到结果)

我想要做的是从table1获取随机ID,但只获取table3中定义的那些。在这种特殊情况下,我不希望收到5和6。

如何重写我的查询以实现我的目标?

提前谢谢。

编辑: 问题是当我试图得到一行没有定义table3中的哪一行时,应用程序就会崩溃。它不是NULL,正如我之前写的,它只是在table3中不存在。如何重写查询以正确处理我的案例?

4 个答案:

答案 0 :(得分:2)

您尚未告诉我们table3中的字段是如何命名的,但假设它们的名称为tab1_idtab2_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 :(得分: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

答案 2 :(得分:0)

不是SQLite问题,而是一般SQL问题。您希望在字段值中测试NULL,例如

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

答案 3 :(得分:0)

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

此查询的意思是“随机选择table1中有table3条目的行。

table1中的每一行都等于被选中的可能性DISTINCT),只要它在table3中被引用至少一次。

如果您尝试从table3中获取table3中的所有列,则应删除“ORDER BY RANDOM() LIMIT 1”子句。