MySQL)如何使用WHILE循环删除重复的行?
我在数据库中有一个名为MySQL)如何使用WHILE循环删除重复的行?,mysql,loops,join,subquery,procedure,Mysql,Loops,Join,Subquery,Procedure,我在数据库中有一个名为cart的表和一个空表sort。我的目标是将逗号分隔的值从一个表传输到另一个表,如下所示: (table cart) id | food ---+-------------- 1 | Carrots, Cucumbers 2 | Dandelions 3 | Salmons 4 | Cucumbers, Potatoes 5 | Tomatoes (table sort after run query) id | food ---+---
cart
的表和一个空表sort
。我的目标是将逗号分隔的值从一个表传输到另一个表,如下所示:
(table cart)
id | food
---+--------------
1 | Carrots, Cucumbers
2 | Dandelions
3 | Salmons
4 | Cucumbers, Potatoes
5 | Tomatoes
(table sort after run query)
id | food
---+--------------
1 | Carrots
1 | Cucumbers
2 | Dandelions
3 | Salmons
4 | Cucumbers
4 | Potatoes
5 | Tomatoes
一个问题是,关键字DISTINCT
、GROUP BY
和ORDER BY
似乎在WHILE
子句中无法正常工作。当我运行查询时,MySQL会根据id
count的总数多次插入整个值列表
请查看此查询:
DELIMITER //
CREATE FUNCTION fx_splitString(columnName TEXT, pos INT)
RETURNS TEXT
RETURN TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(columnName, ',', pos), ',', -1)) //
CREATE PROCEDURE pd_splitRow()
BEGIN
DECLARE rowToll INT;
SET rowToll = (SELECT COUNT(id) FROM cart);
SET @outerCount = 1;
WHILE @outerCount <= rowToll DO
INSERT INTO sort (id, food)
SELECT DISTINCT id, fx_splitString(food, @stringToll) FROM cart;
SET @outerCount = @outerCount + 1;
END WHILE;
END //
DELIMITER ;
CALL pd_splitRow();
我可以用其他人的提问中的例子,但我想创造我自己的来提高技能
有什么方法可以在循环时对使用
的行进行分组吗?在我看来,该函数没有用-考虑使用“限制”和“偏移量”一次读取一行,然后洗牌。@p.Salmon文章中的函数只是为了看起来更好。不管怎样,谢谢你给我提示。我要试试:>MySQL版本?字段中最大独立值的数量?@Akina版本为8.0.19。我不需要有限的数值。
DECLARE rowToll INT;
SET rowToll = (SELECT COUNT(id) FROM cart);
SET @stringToll = (SELECT LENGTH(food) - LENGTH(REPLACE(food, ',', '')) + 1 FROM cart); /* error */
SET @outerCount = 1;
SET @innerCount = 1;
WHILE @outerCount <= rowToll DO
WHILE @innerCount <= @stringToll DO
INSERT INTO sort (id, food)
SELECT DISTINCT id, fx_splitString(food, @stringToll) FROM cart;
SET @innerCount = @innerCount + 1;
END WHILE;
SET @outerCount = @outerCount + 1;
END WHILE;
WHILE @begin <= rowCount DO
INSERT INTO sort (id, food)
SELECT DISTINCT cte1.id, fx_splitString(cte1.food, @begin) FROM cart cte1
INNER JOIN cart cte2 ON cte1.id = cte2.id AND cte1.food = cte2.food;
SET @begin = @begin + 1;
END WHILE;