Laravel Eloquent volgorde per veld als 1,2,3,4,1,2,3,4

stemmen
29

Ik heb een goederenlijstje

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

Hoe kan ik gegevens bestellen via parent_link om gegevens te hebben zoals

ffff
dddd
eeee
zzzz
ffff
dddd
zzzz
zzzz
zzzz
zzzz

dus alle goederen gaan achter elkaar maar altijd met een andere parent_link (vorige rij parent_link != volgende rij parent_link, en het bestellen van A-Z heeft geen verschil)?

De vraag is gesteld op 19/05/2020 om 13:03
bron van user
In andere talen...                            


2 antwoorden

stemmen
0

deze code wordt getest op mysql db.

als u ALLEEN_FULL_GROUP_BY heeft, moet u deze uitschakelen ...

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

maak vervolgens een opgeslagen procedure om de gewenste volgorde te maken:

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

dan kun je het noemen wat je wilt...

het basisidee is om twee temporele tabellen te maken, één om het resultaat vast te houden en een andere om de bewogen gesorteerde rijen te verwijderen, elke terwijl lus ... de verschillende geordende rijen zullen worden verplaatst van de temporele naar de resultatentabel.

let op: als u de kolom 'naam' als de unieke primaire sleutel beschouwt, kunt u deze wijzigen in een geschikte sleutel. u kunt ook de naam van de tabel en de kolomnaam die u wilt sorteren als parameters doorgeven aan de opgeslagen procedure ...

ik heb een tabel gemaakt in mijn db, noem die als 'goederen' en vul de exacte gegevens in die je opgeeft. laat het me weten als het helpt

antwoordde op 21/05/2020 om 23:09
bron van user

stemmen
0

Gebruik voor MySQL 8 eenvoudig

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

Gebruik voor MySQL 5 bijvoorbeeld ROW_NUMBER() emulatie op basis van door de gebruiker gedefinieerde variabelen.

antwoordde op 23/05/2020 om 23:56
bron van user

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