Laravel Eloquente ordine per campo come 1,2,3,4,1,2,3,4

voti
33

Ho la tabella delle merci

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

Come posso ordinare i dati tramite parent_link per avere dati come

ffff
dddd
eeee
zzzz
ffff
dddd
zzzz
zzzz
zzzz
zzzz

quindi tutti i prodotti vanno uno dopo l'altro ma sempre con un parent_link diverso (la fila precedente parent_link != la fila successiva parent_link, e ordinare A-Z non fa differenza)?

È pubblicato 19/05/2020 alle 13:03
fonte dall'utente
In altre lingue...                            


2 risposte

voti
0

questo codice è testato su mysql db.

se avete ONLY_FULL_GROUP_BY, dovete disabilitarla ...

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

poi creare una stored procedure per effettuare l'ordine che si desidera:

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

poi si può chiamare come si vuole ...

l'idea di base è quella di fare due tabelle temporali, una tratterrà il risultato e un'altra per rimuovere le righe ordinate spostate, ogni ciclo di tempo ... le righe ordinate distinte saranno spostate dalla tabella dei risultati temporali a quella dei risultati.

si prega di notare che, considerando la colonna 'nome' come unica chiave primaria, è possibile cambiarla con una chiave adatta. si può anche passare il nome della tabella e il nome della colonna che si desidera ordinare come parametri alla procedura memorizzata ...

ho fatto una tabella nel mio db, l'ho nominata come "merce" e ho inserito i dati esatti da voi forniti. fammi sapere se può essere d'aiuto

Risposto il 21/05/2020 a 23:09
fonte dall'utente

voti
0

Per MySQL 8 utilizzare semplice

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

Per MySQL 5 utilizzare l'emulazione ROW_NUMBER(), ad esempio, basata su variabili definite dall'utente.

Risposto il 23/05/2020 a 23:56
fonte dall'utente

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