Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL)如何使用WHILE循环删除重复的行?_Mysql_Loops_Join_Subquery_Procedure - Fatal编程技术网

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;