Laravel Eloquente Ordnung nach Bereich als 1,2,3,4,1,2,3,4

stimmen
33

Ich habe eine Warentabelle

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

Wie kann ich Daten per parent_link bestellen, um Daten wie

ffff
dddd
eeee
zzzz
ffff
dddd
zzzz
zzzz
zzzz
zzzz

so dass alle Waren nacheinander gehen, aber immer mit unterschiedlichen parent_link (vorherige Zeile parent_link != nächste Zeile parent_link, und die Bestellung von A-Z hat keinen Unterschied)?

Veröffentlicht am 19/05/2020 um 13:03
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

dieser Code wird auf mysql db getestet.

wenn Sie ONLY_FULL_GROUP_BY haben, müssen Sie es deaktivieren ...

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

dann erzeugen Sie eine Stored Procedure, um die gewünschte Reihenfolge herzustellen:

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

dann können Sie es nennen, wie Sie wollen ...

die Grundidee ist, zwei temporäre Tabellen zu erstellen, eine wird das Ergebnis enthalten und eine andere, um verschobene sortierte Zeilen zu entfernen, in jeder while-Schleife ... werden die unterschiedlich geordneten Zeilen aus der temporalen in die Ergebnistabelle verschoben.

beachten Sie bitte, dass Sie die Spalte 'name' als eindeutigen Prim?rschl?ssel betrachten und sie in einen passenden ?ndern k?nnen. sie k?nnen auch den Tabellennamen und den Spaltennamen, nach dem Sie sortieren m?chten, als Parameter an die Stored Procedure ?bergeben ...

ich habe eine Tabelle in meiner db erstellt, sie als "Waren" bezeichnet und die genauen Daten eingefügt, die Sie angegeben haben. bitte lassen Sie es mich wissen, wenn es hilft

Beantwortet am 21/05/2020 um 23:09
quelle vom benutzer

stimmen
0

Für MySQL 8 verwenden Sie einfach

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

Verwenden Sie für MySQL 5 beispielsweise die ROW_NUMBER()-Emulation, die auf benutzerdefinierten Variablen basiert.

Beantwortet am 23/05/2020 um 23:56
quelle vom benutzer

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