我使用以下查询从表中获取随机行:
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中不存在。如何重写查询以正确处理我的案例?
答案 0 :(得分: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
答案 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
”子句。