Laravel Ordre éloquent par champ comme 1,2,3,4,1,2,3,4

voix
33

J'ai le tableau des marchandises

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

Comment puis-je commander des données par parent_link pour avoir des données comme

ffff
dddd
eeee
zzzz
ffff
dddd
zzzz
zzzz
zzzz
zzzz

donc tous les biens vont l'un après l'autre mais toujours avec un parent_link différent (ligne précédente parent_link != ligne suivante parent_link, et commander de A à Z n'a pas de différence) ?

Créé 19/05/2020 à 13:03
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

ce code est testé sur mysql db.

si vous avez ONLY_FULL_GROUP_BY, vous devez le désactiver ...

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

puis créez une procédure stockée pour réaliser l'ordre que vous souhaitez :

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

alors vous pouvez l'appeler comme vous voulez ...

l'idée de base est de faire deux tableaux temporels, l'un contenant le résultat et l'autre supprimant les lignes triées déplacées, à chaque boucle de temps ... les lignes distinctes ordonnées seront déplacées du tableau temporel au tableau de résultats.

veuillez noter que si vous considérez la colonne "nom" comme la clé primaire unique, vous pouvez la changer pour une clé appropriée. vous pouvez également passer le nom de la table et le nom de la colonne que vous voulez trier en tant que paramètres à la procédure enregistrée ...

j'ai fait un tableau dans ma base de données, je l'ai nommé "biens" et j'ai inséré les données exactes que vous avez fournies. faites-moi savoir si cela vous aide

Créé 21/05/2020 à 23:09
source utilisateur

voix
0

Pour MySQL 8, utilisez simple

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

Pour MySQL 5, utilisez l'émulation ROW_NUMBER(), par exemple, basée sur des variables définies par l'utilisateur.

Créé 23/05/2020 à 23:56
source utilisateur

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