Laravel Orden elocuente por campo como 1,2,3,4,1,2,3,4

votos
33

Tengo la mesa de mercancías

good_link, parent_link, name
sdf-sdfg   ffff         rock    
utyruuur   ffff         qwe     
gfhdfggg   dddd         paper   
sdfghvcx   eeee         water   
ncvbcxvb   dddd         tree    
dsgfdsg    zzzz         sdff
sdfsdff    zzzz         fdgdf
sdfgdgg    zzzz         sdfsdf
dsvfdgg    zzzz         ssdfgr
brtyfgh    zzzz         fgdfgdf

¿Cómo puedo ordenar datos por enlace_paterno para tener datos como

ffff
dddd
eeee
zzzz
ffff
dddd
zzzz
zzzz
zzzz
zzzz

así que todos los bienes van uno tras otro pero siempre con diferente parent_link(fila anterior parent_link != fila siguiente parent_link, y el pedido A-Z no tiene ninguna diferencia)?

Publicado el 19/05/2020 a las 13:03
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

este código está probado en mysql db.

si tienes ONLY_FULL_GROUP_BY, debes deshabilitarlo ...

SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))

...y luego crear un procedimiento almacenado para hacer el orden que desee:

CREATE PROCEDURE custom_order()
BEGIN

SET @restCount := 1;
CREATE TEMPORARY TABLE IF NOT EXISTS my_result_table
SELECT   * FROM goods group by parent_link order by parent_link;
CREATE TEMPORARY TABLE IF NOT EXISTS my_temp_table
SELECT   * FROM goods;

   WHILE @restCount >0 DO
   DELETE FROM my_temp_table where (name in (SELECT name FROM  my_result_table));
   INSERT into my_result_table(good_link,parent_link,name) select good_link,parent_link,name FROM my_temp_table group by parent_link order by parent_link;

  set @restCount=(SELECT COUNT(*) FROM my_temp_table);
   END WHILE;
  SELECT * FROM my_result_table;
END

entonces puedes llamarlo como quieras...

la idea básica es hacer dos tablas temporales, una para guardar el resultado y otra para eliminar las filas ordenadas movidas, ...las distintas filas ordenadas se moverán de la tabla temporal a la tabla de resultados.

ten en cuenta que en considerado la columna 'nombre' como la única clave primaria, puedes cambiarla por una adecuada. también puede pasar el nombre de la tabla y el nombre de la columna por los que desea ordenar como parámetros al procedimiento almacenado ...

hice una tabla en mi db, la nombré como "mercancía" e inserté los datos exactos que me proporcionaste. por favor, hágame saber si le ayuda

Respondida el 21/05/2020 a las 23:09
fuente por usuario

votos
0

Para MySQL 8 use simple

WITH cte AS ( SELECT good_link, 
                     parent_link, 
                     name,
                     ROW_NUMBER() OVER (PARTITION BY parent_link) AS rn -- may add any ORDER BY
              FROM source_table )
SELECT good_link, 
       parent_link, 
       name
FROM cte 
ORDER BY rn -- may add any additional expression

Para MySQL 5 usa la emulación ROW_NUMBER(), por ejemplo, basada en variables definidas por el usuario.

Respondida el 23/05/2020 a las 23:56
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more