MySQL) Как удалить дублирующиеся строки, работающие с WHILE l oop? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть таблица с именем 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 won ' не работает должным образом внутри предложения WHILE. Когда я запускаю свой запрос, MySQL вставляет целый список значений несколько раз на основе общего количества id.

Посмотрите на этот запрос:

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();

Сейчас Я пытаюсь найти другие способы выполнения sh этого, но ни одна из этих работ.


Попытка 1: Вложенный L oop

Эта идея прервана, потому что MySQL не позволит установить несколько строк. Я не могу использовать для создания переменной

Код ошибки: 1242. Подзапрос возвращает более 1 строки 0.016 se c

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;

Попробуйте 2 : Self Join

Этот элемент просто не вставляет никаких значений из таблицы cart.

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;

Я мог бы просто использовать в примерах запросы других ребят, но я хочу создать свой собственный для улучшения навыков.

Есть ли способы сгруппировать строки, работающие с WHILE l oop?

...