2009-04-26 4 views
2
나는 다음과 같은 쿼리를 사용하여 내 테이블에서 임의의 행을 얻고있다

:SQLite는 - 복잡한 쿼리

SELECT value_id FROM table1 ORDER BY RANDOM() LIMIT 1 

을 나는 3 개 테이블이 있습니다 표 1과 표 2 - 그들은 행과 그 값의 ID를 가지고 테이블입니다 . 테이블 1과 테이블 2의 행 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에서 나는 뉴욕이 미국에있는 도시이며, 등등 말할 수 있습니다. 그리고 table3에서도 정의되지 않은 값을 가질 수 있습니다. (이 예에서는 아프리카와 중국이므로 결과에 넣고 싶지 않습니다.)

내가 원하는 것은 table1의 무작위 ID에서 얻는 것이지만 table3에 정의 된 것만 얻는 것입니다. 이 특별한 경우에 저는 5와 6을 받기를 원하지 않습니다.

목표를 달성하기 위해 쿼리를 다시 작성하려면 어떻게해야합니까?

미리 감사드립니다.

편집 : 문제는 테이블 3의 행이 정의되지 않은 행을 가져 오려고 할 때 응용 프로그램이 충돌한다는 것입니다. 이전에 썼던 것처럼 그것은 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

random() = order by table1.value_id – Mash

+0

감사합니다. 그것이 내가 필요한 것입니다. 그리고 table3에 정의 된 값이 없다면 쿼리에서 결과를 얻지 못하게하는 방법은 무엇입니까? –

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

2 열의 이름을 모르는, 그래서 나는

이 쿼리가 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에서 적어도 한 번 참조되는 한 (DISTINCT) 선택 될 가능성이 동일합니다.

table1의 table3에있는 모든 열을 가져 오려면 "ORDER BY RANDOM() LIMIT 1"절을 제거해야합니다.