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

Neron

Neron

Пользователи
Реєстрація
12.04.2014
Повідомлення
373
Репутація
24
Вік
32
Мені потрібно створити 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 і так далі.

Які будуть пропозиції?
 
На основі наданих вимог, ви здається намагаєтесь зібрати новий набір записів на основі існуючих даних, а потім вставити новий набір записів в таблицю 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 вже існує, новий запис не буде створено.
 
Останнє редагування модератором:
Назад
Зверху