У меня есть таблица с именем 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?