Ларавел Красноречивый заказ по полям 1,2,3,4,1,2,3,4

голоса
29

У меня есть таблица товаров

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

Как я могу заказать данные по родительской ссылке, чтобы иметь данные типа

ffff
dddd
eeee
zzzz
ffff
dddd
zzzz
zzzz
zzzz
zzzz

так что все товары идут один за другим, но всегда с разной parent_link(предыдущая строка parent_link != следующая строка parent_link, а заказ A-Z не имеет разницы)?

Задан 19/05/2020 в 13:03
источник пользователем
На других языках...                            


2 ответов

голоса
0

этот код тестируется на mysql db.

если у вас есть ТОЛЬКО_FULL_GROUP_BY, вы должны отключить его ...

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

затем создайте сохраненную процедуру, чтобы сделать нужный вам заказ:

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

Тогда ты можешь называть это как хочешь...

Основная идея состоит в том, чтобы сделать две временные таблицы, одна будет держать результат, а другая удалить перемещенные отсортированные строки, каждое время петля... отдельные упорядоченные строки будут перемещаться из временной таблицы в таблицу результатов.

Обратите внимание, что в графе "имя" в качестве уникального первичного ключа вы можете поменять его на подходящий. Вы также можете передать хранимой процедуре имя таблицы и название столбца, по которому хотите произвести сортировку, в качестве параметров ...

Я составил таблицу в своем дб, назвал ее "товаром" и вставил точные данные, которые вы предоставили. Пожалуйста, дайте мне знать, если это поможет

Ответил 21/05/2020 в 23:09
источник пользователем

голоса
0

Для MySQL 8 используйте простую

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

Для MySQL 5 используйте, например, эмуляцию ROW_NUMBER(), основанную на пользовательских переменных.

Ответил 23/05/2020 в 23:56
источник пользователем

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