2017-04-04 8 views
1

를 선택한다. 예는 상기 3 기 OS 결과를 나타낸다SQL 임의로 인터 그룹화 결과 우리 SQLite는 사용 예 A, B, C, D 및 E.</p> <p>, 우리는 5 개 값 범주 도메인을 가질 것이다 ID 및 카테고리 열이 테이블의

목표는

 
ID CAT 
--- --- 
076 C 
753 D 
503 A 
081 B 
335 E 

475 B 
643 D 
995 A 
105 E 
549 C 

553 E 
871 B 
064 C 
720 D 
119 A 

같은 무작위 랜덤 (5 열의 각 그룹 내부에서) 정렬 인터 그룹화 된 행의 수를 제공하는 쿼리를 가지고있다 , 그 행은 무작위로 선택되고 정렬은 무작위입니다.

현재 우리는 5 개의 쿼리 (각 카테고리 당 하나씩)를 사용하여 결과를 가져온 다음 애플리케이션 코드의 모든 것을 정렬합니다.

SELECT * FROM 테이블 여기서 cat = 'A'ORDER BY RANDOM() LIMIT 3;

누군가가 단일 쿼리를 사용하여 더 나은 솔루션을 제안하면 감사하게 생각합니다. 이 작업의

+0

루벤스 - 아마 랄 –

+0

감사합니다 @ 당신 @DanIonescu 귀하의 제안에 대한,하지만 내 접혀 무작위 요구 사항은 어떨까요? 죄송합니다. UNION을 사용하면이를 달성하는 방법을 알 수 없습니다. –

+0

매번 세 그룹의 결과가 매번 고유하거나, maby B, D, A, C, B가 허용 가능합니까 @ rubens-amaral입니까? –

답변

0

당신은 각 카테고리의 행에 autoincrementing ID를 할당하는 다섯 개 임시 테이블을 사용할 수 있습니다

를 같은 nr 값으로 행이 함께 분류되도록
CREATE TEMPORARY TABLE a(nr INTEGER PRIMARY KEY, id); 
CREATE TEMPORARY TABLE b(nr INTEGER PRIMARY KEY, id); 
... 
INSERT INTO temp.a(id) SELECT id FROM MyTable WHERE cat = 'A' ORDER BY random(); 
INSERT INTO temp.b(id) SELECT id FROM MyTable WHERE cat = 'B' ORDER BY random(); 
... 

그런 다음 5 개 개의 테이블을 결합 할 수 있습니다 :

SELECT nr, id, 'A' AS cat, random() AS r FROM temp.a 
UNION ALL 
SELECT nr, id, 'B',  random()  FROM temp.b 
UNION ALL 
... 
ORDER BY nr, r; 
+0

안녕하십니까, 귀하의 제안에 감사드립니다. "ORDER BY nr, random()"은 "두 번째 ORDER BY 조건이 결과 집합의 모든 열과 일치하지 않습니다"라는 오류가 발생합니다. 이 질문에 대한 새로운 질문을 열었습니다. https://stackoverflow.com/questions/43284268/how-to-mix-asc-and-random-on-sqlite-order-by –

+0

죄송합니다. 지금 고쳤다. –

0

당신은 매우 짧은 아니라, 3 개 노조와 함께 다음 쿼리를 사용할 수 있지만 수행합니다

SELECT randomized.id, randomized.cat 
FROM (
    SELECT randomized.id, randomized.cat 
    FROM (
     SELECT id,cat FROM `table_test` ORDER BY RANDOM() 
     ) AS randomized 
    GROUP BY cat 
    ORDER BY RANDOM() 
    ) AS randomized 
UNION ALL 
SELECT randomized.id, randomized.cat 
FROM (
    SELECT randomized.id, randomized.cat 
    FROM (
     SELECT id,cat FROM `table_test` ORDER BY RANDOM() 
     ) AS randomized 
    GROUP BY cat 
    ORDER BY RANDOM() 
    ) AS randomized 
UNION ALL 
SELECT randomized.id, randomized.cat 
FROM (
    SELECT randomized.id, randomized.cat 
    FROM (
     SELECT id,cat FROM `table_test` ORDER BY RANDOM() 
     ) AS randomized 
    GROUP BY cat 
    ORDER BY RANDOM() 
    ) AS randomized  
+0

@DanIonescu. 다시 한번 감사드립니다. 실제로는 쿼리 결과 행이 중복해서는 안됩니다. 귀하의 질의는 각 블록, 즉 ok에서 중복을 방지하지만 UNION 적용으로 중복이 발생할 수 있습니다. 어쩌면 해결책이 없겠지만, 그것은 정말로 도전적입니다. 우리는 WHERE 절 및/또는 JOINS를 사용하여 각 블록이 이전 블록에서 가져온 검색된 데이터를 더 이상 끌어 오지 못하도록하기 위해 노력하고 있지만 여전히 운이 없습니다. –

0

우리는 필요한 결과를 얻을 수있는 방법을 개발했습니다 : 연속적인 블록의 행, 각 블록에는 '고양이'중복이없고 'id'중복은 전혀 없습니다.

그것은 쿼리 지향보다 수학적이지만, 어쨌든 우리의 필요에 부합합니다.

CREATE TEMPORARY TABLE a(nr INTEGER PRIMARY KEY, sort, id, cat); 

INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'A' ORDER BY random() limit 3; 
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'B' ORDER BY random() limit 3; 
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'C' ORDER BY random() limit 3; 
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'D' ORDER BY random() limit 3; 
INSERT INTO temp.a(id, cat) SELECT id, cat FROM tabela WHERE cat = 'E' ORDER BY random() limit 3; 

UPDATE temp.a SET sort=100 where nr=1; 
UPDATE temp.a SET sort=92+(select abs(random()%(2))*16) where nr=4; 
UPDATE temp.a SET sort=88+(select abs(random()%(4))*8) where nr=7; 
UPDATE temp.a SET sort=86+(select abs(random()%(8))*4) where nr=10; 
UPDATE temp.a SET sort=85+(select abs(random()%(16))*2) where nr=13; 

UPDATE temp.a SET sort=200 where nr=2; 
UPDATE temp.a SET sort=192+(select abs(random()%(2))*16) where nr=5; 
UPDATE temp.a SET sort=188+(select abs(random()%(4))*8) where nr=8; 
UPDATE temp.a SET sort=186+(select abs(random()%(8))*4) where nr=11; 
UPDATE temp.a SET sort=185+(select abs(random()%(16))*2) where nr=14; 

UPDATE temp.a SET sort=300 where nr=3; 
UPDATE temp.a SET sort=292+(select abs(random()%(2))*16) where nr=6; 
UPDATE temp.a SET sort=288+(select abs(random()%(4))*8) where nr=9; 
UPDATE temp.a SET sort=286+(select abs(random()%(8))*4) where nr=12; 
UPDATE temp.a SET sort=285+(select abs(random()%(16))*2) where nr=15; 

SELECT id, cat FROM temp.a ORDER BY sort; 

DROP TABLE a; 
당신은, 당신은 (http://www.sqlitetutorial.net/sqlite-union/) [여기]은 exaple을 찾을 수있는 서버에 하나의 쿼리를 실행하는 UNION 절을 사용할 수 있습니다