Laravel Eloquent ordem por campo como 1,2,3,4,1,2,3,4

votos
33

Eu tenho tabela de mercadorias

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

Como posso encomendar dados por parent_link para ter dados como

ffff
dddd
eeee
zzzz
ffff
dddd
zzzz
zzzz
zzzz
zzzz

então todas as mercadorias vão uma após a outra, mas sempre com ligação_para-mãe diferente(linha anterior ligação_para-mãe!= linha seguinte ligação_para-mãe, e encomendar A-Z não tem diferença)?

Publicado 19/05/2020 em 13:03
fonte usuário
Em outras línguas...                            


2 respostas

votos
0

este código é testado no mysql db.

se tiver ONLY_FULL_GROUP_BY, deve desactivá-lo ...

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

então crie um procedimento armazenado para fazer a ordem que você quer:

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

então você pode chamá-lo do que quiser...

a idéia básica é fazer duas tabelas temporais, uma irá manter o resultado e outra para remover as linhas ordenadas movidas, de vez em quando ... as distintas linhas ordenadas serão movidas de temporalmente para a tabela de resultados.

por favor note que na coluna 'nome' como a chave primária única, você pode mudá-la para uma chave adequada. você também pode passar o nome da tabela e o nome da coluna que você deseja classificar como parâmetros para o procedimento armazenado ...

fiz uma tabela no meu db, nomeei-a como 'mercadoria' e introduzi os dados exatos que você forneceu. por favor me avise se isso ajudar

Respondeu 21/05/2020 em 23:09
fonte usuário

votos
0

Para o MySQL 8 use simples

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 use emulação ROW_NUMBER(), por exemplo, com base em variáveis definidas pelo usuário.

Respondeu 23/05/2020 em 23:56
fonte usuário

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