2009-04-26 80 views
2

我從我的表,可以使用下面的查詢獲取隨機行:SQLite的 - 複雜的查詢

SELECT value_id FROM table1 ORDER BY RANDOM() LIMIT 1 

我有3個表: 表1和表2 - 它們是具有行和其價值的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獲得,但只有那些在表3中定義的。在這種特殊情況下,我不希望收到5和6。

如何重寫我的查詢以實現我的目標?

預先感謝您。

編輯: 問題是,當我試圖得到一行的table3中沒有定義的行時,應用程序引發了。它不是NULL,就像我以前寫的那樣,它在table3中不存在。我如何重寫查詢來正確處理我的情況?

回答

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 
+0

order by random()= order by table1.value_id – Mash 2009-04-26 18:19:13

0

不是一個SQLite問題,而是一個通用的SQL問題。您要在字段值中測試NULL,例如

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

按Random()排序意味着它將按不同的列隨機排序。 – Mash 2009-04-26 18:13:30

1

排序隨機( )意味着它會按不同的列隨機排序。

使用此:

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「的條目。

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

如果您試圖從table1中獲取表3中的所有列,則應刪除「ORDER BY RANDOM() LIMIT 1」子句。