SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.08.2016 11:58:35

Валет-69
Завсегдатай
Зарегистрирован: 23.05.2008
Сообщений: 37

Перенос картинок посредством запросов к базе

Для создания нового сайта - старый сайт, интернет-магазин, написанный на CMS "NetCat", был копирован полностью: все его папки, файлы и вся его база. В итоге получилось два идентичных сайта. Но вскоре каталог на новом сайте был существенно изменён, стёрт и затем воссоздан "по образу и подобию" каталога в программе "1С". В числе побочных эффектов - утрата картинок. Они остались в папке "/netcat_files/", но теперь они не выводятся на публичную часть нового сайта, поскольку в его базе указаны прежние пути к ним, унаследованные из базы старого сайта. Чтобы избежать ручной работы и автоматизировать процесс обновления путей к картинкам, возникла следующая идея.
   Все товары находятся в таблицах с именем типа "MessageXXX". Среди прочих, в их структуре есть поле ItemID для уникального идентификатора (пример: 2df506da-eda0-11e4-80c6-3085a918de22), и два поля Image и Preview для адреса картинки большого и малого размера. Вот их примеры.
Image            лопата-1-1-снег.png:image/png:104269:766/1117/lopata_1_1_sneg.png
Preview       лопата-1-1-снег-t.png:image/png:16345:766/1117/lopata_1_1_sneg_t.png
У каждого товара уникальный идентификатор в базе "1С" должен был остаться одним и тем же. Есть идея отправить запрос выдать из базы старого сайта адреса картинок и уникальные идентификаторы из всех строк, где адрес картинки указан. А затем полученные данные закачать в базу нового сайта, руководствуясь правилом: данный адрес поместить в ту товарную строку, в которой находится относящийся к ней уникальный идентификатор.
На ващ взгляд, это очень сложная задача? Насколько она опасна для "жизнидеятельности" сайта? Можно ли обойтись одними запросами к базе через "PhpMyAdmin" хостинга, или понадобится писать скрипт на PHP?

Неактивен

 

#2 05.08.2016 12:56:23

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Перенос картинок посредством запросов к базе

несложная
неопасная (не забудьте сделать резервное копирование перед изменениями)
можно обойтись только запросами к базе через "PhpMyAdmin"

можно обойтись одним запросом, посмотрите в сторону многотабличного update

Неактивен

 

#3 05.08.2016 14:02:37

Валет-69
Завсегдатай
Зарегистрирован: 23.05.2008
Сообщений: 37

Re: Перенос картинок посредством запросов к базе

Хорошо. Спасибо.
Можете написать запрос, чтобы из базы user13764_1 старого сайта были выданы (хорошо бы, столбиком) все уникальные идентификаторы из поля ItemID, для которых в строках указаны адрес картинки большого (поле Image) размера и малого (поле Preview). Т. е. их клетки не пустуют. Конечно, вместе с этими адресами.

Неактивен

 

#4 05.08.2016 14:11:24

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Перенос картинок посредством запросов к базе

select .ItemID, user13764_1.`имя талицы`.Imuser13764_1.`имя талицы`age, user13764_1.`имя талицы`.Preview from user13764_1.`имя талицы` where Image is not null;  -- или Image <> '' если для незаполненного поля хранится пустая строка

Неактивен

 

#5 05.08.2016 17:23:12

Валет-69
Завсегдатай
Зарегистрирован: 23.05.2008
Сообщений: 37

Re: Перенос картинок посредством запросов к базе

А можно составить такой запрос, чтобы выдача была совершена из всех таблиц, которые есть в базе?
Причём из тех таблиц, в которых есть поле ItemID, и из тех строк (записей), в которых в поле Imag "хранится пустая строка".
Ведь этих таблиц свыше пятисот, а в каждой из них записей свыше тысячи.

Неактивен

 

#6 05.08.2016 17:25:48

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Перенос картинок посредством запросов к базе

Если Вы не знаете перечень этих таблиц заранее, то это придется либо хранимую процедуру писать, либо на клиенте БД уже это генерировать.Вы можете получить список всех таблиц из information_schema, а там уже смотреть, если ли там поле ItemID.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 07.08.2016 10:26:02

Валет-69
Завсегдатай
Зарегистрирован: 23.05.2008
Сообщений: 37

Re: Перенос картинок посредством запросов к базе

vasya написал:

select .ItemID, user13764_1.`имя талицы`.Imuser13764_1.`имя талицы`age, user13764_1.`имя талицы`.Preview from user13764_1.`имя талицы` where Image is not null;  -- или Image <> '' если для незаполненного поля хранится пустая строка

Вставил в окно запроса "MyPHPAdmin". Прочёл ругательство по поводу "неожиданной точки", которая находится вот здесь:
Imuser13764_1.`Message3`age

Просьба составить запрос снова, по немного изменённому заданию.
Надо из таблицы Message3 в базе ser13764_1 вывести содержимое полей ItemID, Image и Preview в отношении тех записей (горизонтальных строк), где в полях Image или Preview не пусто и нет пустой строки.

Неактивен

 

#8 07.08.2016 18:52:03

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Перенос картинок посредством запросов к базе

`имя базы данных`.`имя таблицы`.`имя поля`

что значит "не пусто"?

Неактивен

 

#9 08.08.2016 12:28:38

Валет-69
Завсегдатай
Зарегистрирован: 23.05.2008
Сообщений: 37

Re: Перенос картинок посредством запросов к базе

Спасибо.  Уже получилось добиться нужного результата следующим образом.
Выяснилось, что все товары интермага находятся в одной таблице Message321. И в базе user13764_1, и в базе user13764_2.
Вот строка запроса, использованная для вывода нужных адресов картинок из базы user13764_1
SELECT  ItemID, ProductCode, Name, Image, Preview FROM Message321 where Name is not null AND Image is not null AND Preview is not null;

Поля
ItemID - уникальный идентификатор товара (при синхронизации с "1С", заливается из её базы).
ProductCode - артикул товара, присвоенный производителем (поставщиком товара).
Name - название товара
Image - относительный адрес большой картинки
Preview - относительный адрес малой картинки (превью)

Базы
user13764_1 - имя базы сайта-оригинала, откуда адреса картинок надо взять
user13764_2 - имя базы сайта-копии, куда эти адреса надо поместить, используя в качестве ориентира названия товаров в поле Name

Если изобразить схематично, то вот что вырисовывается.

выбрать  user13764_1                        Name (название товара)                                Image          Preview
                                    вставить по идентичным значениям (ориентир)                вставить       вставить
вставить user13764_2                        Name (название товара)                                Image          Preview

Первый этап пройден. Нужен запрос для второго этапа, для ввода.
Второй этап планируется пройти с помощью CSV-файла и второго скрипта.
1) Можно ли два этапа осуществить только с помощью PHPMyAdmin?
2) Можно ли в качестве ориентира (идентификатора) использовать названия товаров в поле Name? Насколько качественным будет результат? Конечно, поля ItemID и ProductCode более удобны, но они в базе сайта-оригинала заполнены не по всем строкам.

Отредактированно Валет-69 (08.08.2016 13:26:19)

Неактивен

 

#10 08.08.2016 12:53:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Перенос картинок посредством запросов к базе

можно или нет использовать в качестве идентификатора name зависит от того является ли это поле уникальным.

Неактивен

 

#11 08.08.2016 13:29:02

Валет-69
Завсегдатай
Зарегистрирован: 23.05.2008
Сообщений: 37

Re: Перенос картинок посредством запросов к базе

Предположим, что уникальность этого поля не абсолютная, не к этому абсолюту стремящаяся, почти придельная.
И пусть там, где есть сходство, один и тот же путь к картинке будет записан дважды.
1) Можно ли два этапа осуществить только с помощью PHPMyAdmin?
2) Просьба написать запрос для второго этапа, для ввода.

Неактивен

 

#12 08.08.2016 13:36:06

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Перенос картинок посредством запросов к базе

при отсутствии уникальности у некоторых товаров может быть указана неправильная картинка, но еси таки мало, то их можно потом вручную поправить

зачем вам два этапа? почему сразу не написать update?

Неактивен

 

#13 08.08.2016 13:51:56

Валет-69
Завсегдатай
Зарегистрирован: 23.05.2008
Сообщений: 37

Re: Перенос картинок посредством запросов к базе

Внушает опасение, что надо работать с двумя базами. Из одной вытащить, а в другую вставить.
В обеих операциях должны участвовать две таблицы, но с одним и тем же именем Message321.
Что Вы предлагаете? Как бы Вы решили задачу? Можно описать подробнее Ваш способ.
Давайте предположим, что уникальность названий товаров в каждой строке абсолютная.

Отредактированно Валет-69 (08.08.2016 13:52:57)

Неактивен

 

#14 08.08.2016 14:03:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Перенос картинок посредством запросов к базе

Валет-69 написал:

Внушает опасение, что надо работать с двумя базами. Из одной вытащить, а в другую вставить.
В обеих операциях должны участвовать две таблицы, но с одним и тем же именем Message321.

`имя базы данных`.`имя таблицы`.`имя поля`


Валет-69 написал:

Что Вы предлагаете? Как бы Вы решили задачу? Можно описать подробнее Ваш способ.
Давайте предположим, что уникальность названий товаров в каждой строке абсолютная.

UPDATE t1,t2 SET t1.image=t2.image.price, t1.Preview=t2.Preview
WHERE t1.name=t2.name AND ваше условие на непустые значения полей;

и не забудьте сделать резервное копирование

Неактивен

 

#15 08.08.2016 14:35:07

Валет-69
Завсегдатай
Зарегистрирован: 23.05.2008
Сообщений: 37

Re: Перенос картинок посредством запросов к базе

Т. е. во второй таблице все поля должны стать идентичными полям в первой?
Это совершенно неприемлемо. В новой таблице записей в четыре раза больше.
Она создана не вручную, целиком с помощью синхронизации сайта с "1С".
Внести сведения о старых путях к картинкам надо только в полях Image и Preview.
И не во всех записях.

Неактивен

 

#16 08.08.2016 16:18:57

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Перенос картинок посредством запросов к базе

Валет-69 написал:

Т. е. во второй таблице все поля должны стать идентичными полям в первой?

Почему?
Изменится только
SET t1.image=t2.image.price, t1.Preview=t2.Preview
и только там где
t1.name=t2.name AND ваше условие на непустые значения полей

Неактивен

 

#17 09.08.2016 10:19:29

Валет-69
Завсегдатай
Зарегистрирован: 23.05.2008
Сообщений: 37

Re: Перенос картинок посредством запросов к базе

Задача стояла вывести все строки из  поля name в базе user13764_1, значения которых идентичны значениям в строках поля тоже name, но в базе user13764_2
Запрос составлен верно?
SELECT `name` FROM user13764_1.Message510 WHERE `name` IN (SELECT `name` FROM user13764_2.Message510);

Неактивен

 

#18 09.08.2016 10:56:41

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Перенос картинок посредством запросов к базе

Валет-69 написал:

Задача стояла вывести все строки из  поля name в базе user13764_1, значения которых идентичны значениям в строках поля тоже name, но в базе user13764_2

я понял как обновить поля image и preview у тех строк которые имеют совпадение по name со старой базой и соответствующие поля в старой базе не пусты.


Валет-69 написал:

Задача стояла вывести все строки из  поля name в базе user13764_1, значения которых идентичны значениям в строках поля тоже name, но в базе user13764_2
Запрос составлен верно?
SELECT `name` FROM user13764_1.Message510 WHERE `name` IN (SELECT `name` FROM user13764_2.Message510);

да

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson