Допоможіть створити потрібний мені SQL-запит

Neron

Neron

Користувачі
Дописи
364
Репутація
25
Прийняті рішення
1
Мені потрібно створити SQL запит, для MySQL таблиці, який зможе прописати масово потрібні дані, тільки для потрібних товарів.
Маємо таблицю: oc_product_description, якщо в стовпці name маємо ключові слова: Кожаный чехол Xshield, то беремо дані зі стовпця product_id і прописуємо їх в таблицю: oc_product_video в стовпець: product_id. В стовпчик sort_order - прописуємо 0, в стовпець url, прописуємо HBOa_WQI4Uk, в стовпець: product_video_id прописуємо 2501, але для кожного наступного запису збільшуємо на 1, тобто: 2501, 2502, 2503 і так далі.

Які будуть пропозиції?
 
Рішення
WebBiz_Bot
Дякую, це працює. Як зробити так, якщо в таблиці oc_product_video вже є запис для конкретного product_id, то його оминати, якщо немає то зробити запис?
Ви можете додати умову `NOT EXISTS` в ваш запит, щоб перевірити, чи запис ще не існує в таблиці `oc_product_video`, перш ніж вставити його.

Пропоную вам наступний 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%'
AND NOT EXISTS (
  SELECT 1...
На основі наданих вимог, ви здається намагаєтесь зібрати новий набір записів на основі існуючих даних, а потім вставити новий набір записів в таблицю 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'. Будьте обережні, переконайтеся, що це те, що ви хочете зробити.
 
На основі наданих вимог, ви здається намагаєтесь зібрати новий набір записів на основі існуючих даних, а потім вставити новий набір записів в таблицю 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'. Будьте обережні, переконайтеся, що це те, що ви хочете зробити.
Дякую боте, це чудово працює. Але як зробити так, щоб якщо в таблиці oc_product_description зустрічаються дублікати product_id, то щоб працювати тільки з першим ID, а дублікат ігнорувати?
 
Дякую боте, це чудово працює. Але як зробити так, щоб якщо в таблиці oc_product_description зустрічаються дублікати product_id, то щоб працювати тільки з першим ID, а дублікат ігнорувати?
Щоб враховувати лише унікальні 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 вибере лише один запис з кожної групи дублів (зазвичай це перший знайдений запис).
 
Останнє редагування модератором:
Щоб враховувати лише унікальні 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.
 
Тепер до цього запиту, треба додати в таблицю oc_product_video в стовпець source, запис youtube.
Додати новий стовпчик у ваш запит досить просто. Вам потрібно додати нове поле до вашого внутрішнього запиту.
Ось оновлений 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' для кожного створеного запису.
 
Додати новий стовпчик у ваш запит досить просто. Вам потрібно додати нове поле до вашого внутрішнього запиту.
Ось оновлений 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' для кожного створеного запису.
Дякую, це працює. Як зробити так, якщо в таблиці oc_product_video вже є запис для конкретного product_id, то його оминати, якщо немає то зробити запис?
 
Дякую, це працює. Як зробити так, якщо в таблиці oc_product_video вже є запис для конкретного product_id, то його оминати, якщо немає то зробити запис?
Ви можете додати умову `NOT EXISTS` в ваш запит, щоб перевірити, чи запис ще не існує в таблиці `oc_product_video`, перш ніж вставити його.

Пропоную вам наступний 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%'
AND NOT EXISTS (
  SELECT 1
  FROM oc_product_video
  WHERE product_id = c.product_id
);

Цей запит перевірить наявність запису з конкретним product_id в таблиці `oc_product_video` перед спробою вставки. Якщо запис для product_id вже існує, новий запис не буде створено.
 
Останнє редагування модератором:
Назад
Зверху