Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL选择随机插入的分组结果_Sql_Sqlite_Random_Group By_Sql Order By - Fatal编程技术网

SQL选择随机插入的分组结果

SQL选择随机插入的分组结果,sql,sqlite,random,group-by,sql-order-by,Sql,Sqlite,Random,Group By,Sql Order By,对于具有ID和category列的表,我们将有一个具有5个值的类别域,例如a、B、C、D和E 我们正在使用SQLite 我们的目标是创建一个查询,在每组5行中随机选择并随机排序若干插入的分组行,例如 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

对于具有ID和category列的表,我们将有一个具有5个值的类别域,例如a、B、C、D和E

我们正在使用SQLite

我们的目标是创建一个查询,在每组5行中随机选择并随机排序若干插入的分组行,例如

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 上面的示例显示了3组os结果,它们的行是随机选择的,其排序也是随机的

目前,我们正在使用5个查询来提取结果,每个类别一个查询,然后根据应用程序代码对所有内容进行排序

从表中选择*,其中cat='A'顺序由随机限制3决定


如果有人通过使用单个查询建议更好的解决方案,我们将不胜感激。

您可以将以下查询用于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    

您可以将以下查询用于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    

可以使用五个临时表为每个类别中的行分配ID:

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();
...
然后可以组合这五个表,以便将具有相同nr值的行排序在一起:

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;

可以使用五个临时表为每个类别中的行分配ID:

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();
...
然后可以组合这五个表,以便将具有相同nr值的行排序在一起:

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;

开发了一种获得我们需要的结果的方法:连续的行块,每个行块没有“cat”重复,并且根本没有“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;

开发了一种获得我们需要的结果的方法:连续的行块,每个行块没有“cat”重复,并且根本没有“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;

您可以使用UNION子句向服务器发出单个查询,您可以在@rubens amaralThank You@DanIonescu中找到一个示例作为您的建议,但是我的要求呢?很抱歉,但是使用UNION我不知道如何实现这一点。你想让3组结果的类别每次都是唯一的,还是maby B,D,A,C,B是可接受的@rubens amaral?是的,每个组都应该有唯一的类别,所以B,D,A,C,B是不可接受的。你可以使用UNION子句向服务器发出单个查询,你可以找一个例子@rubens amaralThank you@DanIonescu作为你的建议,但是我的要求呢?很抱歉,但使用UNION我不知道如何实现这一点。你想让三组结果的类别每次都是唯一的,还是说maby B、D、A、C、B是可以接受的@rubens amaral?是的,每个组都应该有唯一的类别,所以B、D、A、C、B是不可接受的再次感谢@DanIonescu。实际上,查询应该没有重复的结果行。您的查询可以防止每个块内的重复,这是正常的,但当UNION应用时,可能会发生重复。也许没有解决办法,这确实是一个挑战。我们正在尝试使用WHERE子句和/或联接来处理您的建议,这样每个块就不会再从以前的块中提取任何检索到的数据,但仍然没有幸运再次感谢您@DanIonescu。实际上,查询应该没有重复的结果行。您的查询可以防止每个块内的重复,这是正常的,但当UNION应用时,可能会发生重复。也许没有解决办法,这确实是一个挑战。我们正在尝试使用WHERE子句和/或联接来处理您的建议,这样每个块就不会再从上一个块中提取任何检索到的数据,但仍然没有luckHi@CL,谢谢您的建议,但是按nr、random的顺序正在上升一个错误,按术语的第二个顺序与结果集中的任何列都不匹配。我提出了一个关于这个Oops的新问题;现在已修复。您好@CL,谢谢您的建议,但按nr、random排序的顺序正在上升一个错误,按术语排序的第二个顺序与结果集中的任何列都不匹配。我提出了一个关于这个Oops的新问题;现在修好了。