Laravel Wymowna kolejność według pól jako 1,2,3,4,1,2,3,4

głosy
33

Mam tabelę towarową

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

Jak mogę zamówić dane przez parent_link, aby mieć dane takie jak

ffff
dddd
eeee
zzzz
ffff
dddd
zzzz
zzzz
zzzz
zzzz

więc wszystkie towary idą jeden po drugim, ale zawsze z innym parent_link(poprzedni rząd parent_link != następny rząd parent_link, a zamówienie A-Z nie ma różnicy)?

Utwórz 19/05/2020 o 13:03
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
0

ten kod jest testowany na mysql db.

jeśli masz ONLY_FULL_GROUP_BY, musisz go wyłączyć ...

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

następnie utwórz zapisaną procedurę, aby złożyć zamówienie, które chcesz:

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

to możesz nazywać to jak chcesz...

podstawową ideą jest stworzenie dwóch tymczasowych tabel, jedna zatrzyma wynik, a druga usunie przesunięte posortowane rzędy, co chwila pętla ... oddzielne uporządkowane wiersze zostaną przeniesione z tabeli czasowej do wynikowej.

pamiętaj, że w rozważanej kolumnie "nazwa" jako unikalny klucz główny, możesz zmienić go na odpowiedni. możesz również przekazać nazwę tabeli i nazwę kolumny, którą chcesz posortować jako parametry do przechowywanej procedury ...

zrobiłem tabelę w moim db, nazwałem ją "towar" i wprowadziłem dokładne dane, które podałeś. proszę dać mi znać, jeśli to pomoże

Odpowiedział 21/05/2020 o 23:09
źródło użytkownik

głosy
0

Dla MySQL 8 użyj prostego

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

Dla MySQL 5 użyj emulacji ROW_NUMBER(), na przykład na podstawie zmiennych zdefiniowanych przez użytkownika.

Odpowiedział 23/05/2020 o 23:56
źródło użytkownik

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