sql查询,可同时进行分组、排序和随机查询

3htmauhk  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(537)

我找不到任何类似的问题。

  1. CREATE TABLE IF NOT EXISTS `test` (
  2. `Id` int(11) NOT NULL AUTO_INCREMENT,
  3. `Nombre` varchar(50) COLLATE utf8_spanish2_ci DEFAULT NULL,
  4. `Orden` int(11) DEFAULT NULL,
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_spanish2_ci;
  7. INSERT INTO `test` (`Id`, `Nombre`, `Orden`) VALUES
  8. (1, 'Mark', NULL),
  9. (2, 'David', 1),
  10. (3, 'John', 1),
  11. (4, 'David', 2),
  12. (5, 'John', 3),
  13. (6, 'John', 2),
  14. (7, 'William', NULL);

正如我们所看到的,约翰和大卫不止一行,还有一个order列,所以我们可以简单地使用order-by-name asc,order-asc进行排序,但这并不是我需要的。。

问题是:我想知道是否可以按名称排序,并为每个名称创建某种类型的组,然后按其顺序排序,然后按rand()应用最终顺序,这样您仍然可以查看david、mark、john和william的所有行,但顺序是随机的。。

所以每次运行查询时,顺序都是完全随机的,但仍然有一些顺序。。

这是一把小提琴http://sqlfiddle.com/#!9/038bd7/7号

sqougxex

sqougxex1#

此查询:

  1. select Nombre, rand() rnd
  2. from test
  3. group by Nombre

返回表中每个唯一名称的随机数。
将它连接到表中,首先按该随机数排序,然后按 Orden :

  1. select t.*
  2. from test t
  3. inner join (select Nombre, rand() rnd from test group by Nombre) r
  4. on r.Nombre = t.Nombre
  5. order by r.rnd, t.Orden

请看演示。
结果:

  1. > Id | Nombre | Orden
  2. > -: | :------ | ----:
  3. > 7 | William | null
  4. > 1 | Mark | null
  5. > 2 | David | 1
  6. > 4 | David | 2
  7. > 3 | John | 1
  8. > 6 | John | 2
  9. > 5 | John | 3
  10. > Id | Nombre | Orden
  11. > -: | :------ | ----:
  12. > 2 | David | 1
  13. > 4 | David | 2
  14. > 3 | John | 1
  15. > 6 | John | 2
  16. > 5 | John | 3
  17. > 1 | Mark | null
  18. > 7 | William | null
  19. > Id | Nombre | Orden
  20. > -: | :------ | ----:
  21. > 2 | David | 1
  22. > 4 | David | 2
  23. > 1 | Mark | null
  24. > 7 | William | null
  25. > 3 | John | 1
  26. > 6 | John | 2
  27. > 5 | John | 3
展开查看全部
wd2eg0qa

wd2eg0qa2#

嗯,我真的以为这样行得通,但似乎不行。不管怎样,我都会把它贴出来,以防它能激励其他人。。。

  1. select * from test
  2. order by field(nombre,
  3. (select group_concat(distinct concat('\'',nombre,'\'') order by rand()) from test)
  4. );

这似乎奏效了。。。

  1. select @i:= group_concat(distinct nombre order by rand()) from test;
  2. select *,find_in_set(nombre,@i) n from test order by n,orden

相关问题