este código é testado no mysql db.
se tiver ONLY_FULL_GROUP_BY, deve desactivá-lo ...
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''))
então crie um procedimento armazenado para fazer a ordem que você quer:
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
então você pode chamá-lo do que quiser...
a idéia básica é fazer duas tabelas temporais, uma irá manter o resultado e outra para remover as linhas ordenadas movidas,
de vez em quando ... as distintas linhas ordenadas serão movidas de temporalmente para a tabela de resultados.
por favor note que na coluna 'nome' como a chave primária única, você pode mudá-la para uma chave adequada.
você também pode passar o nome da tabela e o nome da coluna que você deseja classificar como parâmetros para o procedimento armazenado ...
fiz uma tabela no meu db, nomeei-a como 'mercadoria' e introduzi os dados exatos que você forneceu.
por favor me avise se isso ajudar