Laravel Eloquent comandă pe câmp ca 1,2,3,4,1,2,3,4

voturi
29

Am masa de marfa

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

Cum pot comanda date de la parent_link pentru a avea date de genul

ffff
dddd
eeee
zzzz
ffff
dddd
zzzz
zzzz
zzzz
zzzz

deci toate mărfurile merg una după alta, dar întotdeauna cu parent_link diferite (rândul anterior parent_link! = rândul următor parent_link, iar comanda AZ nu are nicio diferență)?

Întrebat 19/05/2020 la 13:03
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
0

acest cod este testat pe mysql db.

dacă aveți DOAR_FULL_GROUP_BY, trebuie să o dezactivați ...

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

apoi creați o procedură stocată pentru a face comanda dorită:

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

atunci îl poți numi cum vrei ...

ideea de bază este de a realiza două tabele temporale, una va ține rezultatul și alta pentru a elimina rândurile sortate mutate, la fiecare buclă în timp ce ... rândurile distincte ordonate vor fi mutate din tabelul temporal în rezultat.

Vă rugăm să rețineți că, considerată coloana „nume” drept cheia principală unică, o puteți schimba în una potrivită. de asemenea, puteți trece numele tabelei și numele coloanei pe care doriți să le sortați ca parametri la procedura stocată ...

Am făcut un tabel în db-ul meu, l-am denumit drept „bunuri” și am introdus datele exacte pe care le furnizați. vă rog, anunțați-mă dacă vă ajută

Publicat 21/05/2020 la 23:09
sursa de către utilizator

voturi
0

Pentru MySQL 8 folosiți simplu

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

Pentru MySQL 5 folosiți emulația ROW_NUMBER (), de exemplu, bazată pe variabile definite de utilizator.

Publicat 23/05/2020 la 23:56
sursa de către utilizator

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