2009-04-26 11 views
2

私は次のクエリを使用して、私のテーブルからランダムに行を取得しています:のSQLite - 複雑なクエリ

SELECT value_id FROM table1 ORDER BY RANDOM() LIMIT 1 

私は3つのテーブルがあります。 TABLE1とtable2のを - 彼らは、行のIDとその値を持つテーブルです。 table1とtable2の行のIDを列として持つtable3もあります。

すなわち:

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には存在しません。ケースを適切に処理するためにクエリを書き直すにはどうすればよいですか?

答えて

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

+0

ありがとう、それは私が必要なものです。そして、もし私が表3で定義された値を持っていなければ、私はその結果を私の問い合わせに入れないようにする方法を教えてください。 –

+0

これはあなたが必要としているものではありません - あなたはランダムな列を必要とし、ランダムな列を必要としませんか? 適切なSQLを使用して、私は答えた。 – Mash

0

SQLiteに関する質問ではなく、一般的なSQLの問題です。フィールド値にNULLがあるかどうかをテストしたいとします。

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

ランダム()は、別の列でランダムに並べ替えることを意味します。 – Mash

1

注文ランダムで)は、別の列でランダムに並べ替えることを意味します。

使用この:

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

COLUMN2の名前がわからないので、私はそれが

このクエリはあり table1からランダム行で選ぶ」という意味
0
SELECT rowid FROM table1 
WHERE rowid IN (SELECT DISTINCT table1_id FROM table3) 
ORDER BY RANDOM() LIMIT 1; 

をSECOND_VALUE呼ばれてきましたエントリはtable3です。

テーブル1の各行は、table3で少なくとも1回参照される限り、選択される可能性が同じです(DISTINCT)。

table3からtable1のすべての列を取得しようとしている場合は、「ORDER BY RANDOM() LIMIT 1」句を削除する必要があります。