SET @id := 2500;
INSERT INTO oc_product_video (product_id, sort_order, url, product_video_id)
SELECT
product_id,
0 AS sort_order,
'HBOa_WQI4Uk' AS url,
(@id := @id + 1) AS product_video_id
FROM oc_product_description
WHERE name LIKE '%Кожаный чехол Xshield%';
Дякую боте, це чудово працює. Але як зробити так, щоб якщо в таблиці oc_product_description зустрічаються дублікати product_id, то щоб працювати тільки з першим ID, а дублікат ігнорувати?На основі наданих вимог, ви здається намагаєтесь зібрати новий набір записів на основі існуючих даних, а потім вставити новий набір записів в таблицю oc_product_video.
Щоб ви безпосередньо змогли це зробити за допомогою одного запиту, побудуйте спочатку вибірку записів і, одночасно, використйте змінну для створення унікального product_video_id для кожного нового запису.
Ваш запит може виглядати так:
SQL:SET @id := 2500; INSERT INTO oc_product_video (product_id, sort_order, url, product_video_id) SELECT product_id, 0 AS sort_order, 'HBOa_WQI4Uk' AS url, (@id := @id + 1) AS product_video_id FROM oc_product_description WHERE name LIKE '%Кожаный чехол Xshield%';
Що він робить: зapит встановлює змінну @id в 2500 перед вставкою. В рамках запиту вставки, для заповнення кожного рядка:
- product_id витягується з таблиці oc_product_description
- sort_order встановлюється як 0
- url встановлюється як 'HBOa_WQI4Uk'
- product_video_id розраховується як поточне значення @id + 1
Пам'ятайте, що цей запит вплине на всі записи в oc_product_description, де name містить 'Кожаный чехол Xshield'. Будьте обережні, переконайтеся, що це те, що ви хочете зробити.
Щоб враховувати лише унікальні product_id при створенні нового набору записів, ви можете використати виділення з групуванням. Варто зауважити, що у разі дублікатів буде взято лише одне значення product_id:Дякую боте, це чудово працює. Але як зробити так, щоб якщо в таблиці oc_product_description зустрічаються дублікати product_id, то щоб працювати тільки з першим ID, а дублікат ігнорувати?
SET @id := 2500;
INSERT INTO oc_product_video (product_id, sort_order, url, product_video_id)
SELECT
c.product_id,
0 AS sort_order,
'HBOa_WQI4Uk' AS url,
(@id := @id + 1) AS product_video_id
FROM (
SELECT product_id, name
FROM oc_product_description
GROUP BY product_id
) AS c
WHERE c.name LIKE '%Кожаный чехол Xshield%';
Тепер до цього запиту, треба додати в таблицю oc_product_video в стовпець source, запис youtube.Щоб враховувати лише унікальні product_id при створенні нового набору записів, ви можете використати виділення з групуванням. Варто зауважити, що у разі дублікатів буде взято лише одне значення product_id:
SQL:SET @id := 2500; INSERT INTO oc_product_video (product_id, sort_order, url, product_video_id) SELECT c.product_id, 0 AS sort_order, 'HBOa_WQI4Uk' AS url, (@id := @id + 1) AS product_video_id FROM ( SELECT product_id, name FROM oc_product_description GROUP BY product_id ) AS c WHERE c.name LIKE '%Кожаный чехол Xshield%';
Зауважте, що ми використовуємо внутрішній запит SELECT, щоб згрупувати записи за product_id перед фільтрацією значень name. Унікальність product_id забезпечується командою GROUP BY.
У цьому запиті ми також врахували те, що записи з дубльованими product_id можуть мати різні значення name. GROUP BY вибере лише один запис з кожної групи дублів (зазвичай це перший знайдений запис).
Додати новий стовпчик у ваш запит досить просто. Вам потрібно додати нове поле до вашого внутрішнього запиту.Тепер до цього запиту, треба додати в таблицю oc_product_video в стовпець source, запис youtube.
SET @id := 2500;
INSERT INTO oc_product_video (product_id, sort_order, url, source, product_video_id)
SELECT
c.product_id,
0 AS sort_order,
'HBOa_WQI4Uk' AS url,
'youtube' AS source,
(@id := @id + 1) AS product_video_id
FROM (
SELECT product_id, name
FROM oc_product_description
GROUP BY product_id
) AS c
WHERE c.name LIKE '%Кожаный чехол Xshield%';
Дякую, це працює. Як зробити так, якщо в таблиці oc_product_video вже є запис для конкретного product_id, то його оминати, якщо немає то зробити запис?Додати новий стовпчик у ваш запит досить просто. Вам потрібно додати нове поле до вашого внутрішнього запиту.
Ось оновлений SQL-запит:
SQL:SET @id := 2500; INSERT INTO oc_product_video (product_id, sort_order, url, source, product_video_id) SELECT c.product_id, 0 AS sort_order, 'HBOa_WQI4Uk' AS url, 'youtube' AS source, (@id := @id + 1) AS product_video_id FROM ( SELECT product_id, name FROM oc_product_description GROUP BY product_id ) AS c WHERE c.name LIKE '%Кожаный чехол Xshield%';
В цьому новому запиті, поле 'source' отримує значення 'youtube' для кожного створеного запису.
Ви можете додати умову `NOT EXISTS` в ваш запит, щоб перевірити, чи запис ще не існує в таблиці `oc_product_video`, перш ніж вставити його.Дякую, це працює. Як зробити так, якщо в таблиці oc_product_video вже є запис для конкретного product_id, то його оминати, якщо немає то зробити запис?
SET @id := 2500;
INSERT INTO oc_product_video (product_id, sort_order, url, source, product_video_id)
SELECT
c.product_id,
0 AS sort_order,
'HBOa_WQI4Uk' AS url,
'youtube' AS source,
(@id := @id + 1) AS product_video_id
FROM (
SELECT product_id, name
FROM oc_product_description
GROUP BY product_id
) AS c
WHERE c.name LIKE '%Кожаный чехол Xshield%'
AND NOT EXISTS (
SELECT 1
FROM oc_product_video
WHERE product_id = c.product_id
);