Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

312
Vistas
Consulta SQL con Group, Order by y Random al mismo tiempo

No pude encontrar nada similar a este problema.

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

Como vemos, John y David tienen más de una fila y hay una columna Ordenar, por lo que podemos ordenarla simplemente usando ORDENAR POR Nombre ASC, Ordenar ASC, pero esto no es exactamente lo que necesito.

ingrese la descripción de la imagen aquí

Aquí está el problema: me gustaría saber si es posible ordenar por nombre y hacer algún tipo de grupo para cada nombre, luego ordenar por Orden, y luego aplicar un ORDEN POR ALEATORIO() final para que siga viendo todos los filas de david, mark, john y William, pero en orden aleatorio.

ingrese la descripción de la imagen aquí

Entonces, cada vez que ejecuta la consulta, el orden es completamente aleatorio pero aún con algo de orden.

ingrese la descripción de la imagen aquí

Aquí hay un violín http://sqlfiddle.com/#!9/038bd7/7

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

esta consulta:

 select Nombre, rand() rnd from test group by Nombre

devuelve un número aleatorio para cada nombre único en la tabla.
Únalo a la tabla y ordene primero por ese número aleatorio y luego por Orden :

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

Ver la demostración .
Resultados:

 > Id | Nombre | Orden > -: | :------ | ----: > 7 | William | null > 1 | Mark | null > 2 | David | 1 > 4 | David | 2 > 3 | John | 1 > 6 | John | 2 > 5 | John | 3 > Id | Nombre | Orden > -: | :------ | ----: > 2 | David | 1 > 4 | David | 2 > 3 | John | 1 > 6 | John | 2 > 5 | John | 3 > 1 | Mark | null > 7 | William | null > Id | Nombre | Orden > -: | :------ | ----: > 2 | David | 1 > 4 | David | 2 > 1 | Mark | null > 7 | William | null > 3 | John | 1 > 6 | John | 2 > 5 | John | 3
over 4 years ago · Santiago Trujillo Denunciar

0

Hm, realmente pensé que esto funcionaría, pero parece que no. Lo estoy publicando de todos modos, en caso de que inspire a otros...

 select * from test order by field(nombre, (select group_concat(distinct concat('\'',nombre,'\'') order by rand()) from test) );

Esto parece funcionar...

 select @i:= group_concat(distinct nombre order by rand()) from test; select *,find_in_set(nombre,@i) n from test order by n,orden
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda