Первое, что приходит на ум:
A LIMIT
без ORDER BY
совершенно бессмысленно. В реляционной базе данных нет порядка. Он может вернуть любую нужную ему строку.
Второе:
Вместо WHILE
l oop обычно используют CURSOR
в такие случаи.
Третье:
Вам вообще не нужна процедура для этого. Одного утверждения достаточно, чтобы решить вашу проблему:
UPDATE customer c
JOIN (
SELECT customer_id, COUNT(ord_no) AS orderCount
FROM orders
GROUP BY customer_id
) o ON c.customer_id = o.customer_id
SET c.customer_Type = CASE WHEN o.orderCount = 1 THEN 'One-time Customer'
WHEN o.orderCount = 2 THEN 'Repeated Customer'
WHEN o.orderCount = 3 THEN 'Frequent Customer'
ELSE 'Loyal Customer'
END;
Четвертое:
Когда клиент еще ничего не заказал, customerType не обновляется. Вы должны добавить это дело тоже, я думаю. Для этого включите JOIN в LEFT JOIN и добавьте еще один регистр.
UPDATE customer c
LEFT JOIN (
SELECT customer_id, COUNT(ord_no) AS orderCount
FROM orders
GROUP BY customer_id
) o ON c.customer_id = o.customer_id
SET c.customer_Type = CASE WHEN o.orderCount = 1 THEN 'One-time Customer'
WHEN o.orderCount = 2 THEN 'Repeated Customer'
WHEN o.orderCount = 3 THEN 'Frequent Customer'
WHEN o.orderCount IS NULL THEN "hasn't ordered yet"
ELSE 'Loyal Customer'
END;
Или, возможно, лучше прочитать:
UPDATE customer c
LEFT JOIN (
SELECT customer_id, COUNT(ord_no) AS orderCount
FROM orders
GROUP BY customer_id
) o ON c.customer_id = o.customer_id
SET c.customer_Type = CASE COALESCE(o.orderCount, 0)
WHEN 0 THEN "hasn't ordered yet"
WHEN 1 THEN 'One-time Customer'
WHEN 2 THEN 'Repeated Customer'
WHEN 3 THEN 'Frequent Customer'
ELSE 'Loyal Customer'
END;