Задавайте вопросы, мы ответим
Вы не зашли.
Для создания нового сайта - старый сайт, интернет-магазин, написанный на 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?
Неактивен
несложная
неопасная (не забудьте сделать резервное копирование перед изменениями)
можно обойтись только запросами к базе через "PhpMyAdmin"
можно обойтись одним запросом, посмотрите в сторону многотабличного update
Неактивен
Хорошо. Спасибо.
Можете написать запрос, чтобы из базы user13764_1 старого сайта были выданы (хорошо бы, столбиком) все уникальные идентификаторы из поля ItemID, для которых в строках указаны адрес картинки большого (поле Image) размера и малого (поле Preview). Т. е. их клетки не пустуют. Конечно, вместе с этими адресами.
Неактивен
Неактивен
А можно составить такой запрос, чтобы выдача была совершена из всех таблиц, которые есть в базе?
Причём из тех таблиц, в которых есть поле ItemID, и из тех строк (записей), в которых в поле Imag "хранится пустая строка".
Ведь этих таблиц свыше пятисот, а в каждой из них записей свыше тысячи.
Неактивен
Если Вы не знаете перечень этих таблиц заранее, то это придется либо хранимую процедуру писать, либо на клиенте БД уже это генерировать.Вы можете получить список всех таблиц из information_schema, а там уже смотреть, если ли там поле ItemID.
Неактивен
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 не пусто и нет пустой строки.
Неактивен
`имя базы данных`.`имя таблицы`.`имя поля`
что значит "не пусто"?
Неактивен
Спасибо. Уже получилось добиться нужного результата следующим образом.
Выяснилось, что все товары интермага находятся в одной таблице 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)
Неактивен
можно или нет использовать в качестве идентификатора name зависит от того является ли это поле уникальным.
Неактивен
Предположим, что уникальность этого поля не абсолютная, не к этому абсолюту стремящаяся, почти придельная.
И пусть там, где есть сходство, один и тот же путь к картинке будет записан дважды.
1) Можно ли два этапа осуществить только с помощью PHPMyAdmin?
2) Просьба написать запрос для второго этапа, для ввода.
Неактивен
при отсутствии уникальности у некоторых товаров может быть указана неправильная картинка, но еси таки мало, то их можно потом вручную поправить
зачем вам два этапа? почему сразу не написать update?
Неактивен
Внушает опасение, что надо работать с двумя базами. Из одной вытащить, а в другую вставить.
В обеих операциях должны участвовать две таблицы, но с одним и тем же именем Message321.
Что Вы предлагаете? Как бы Вы решили задачу? Можно описать подробнее Ваш способ.
Давайте предположим, что уникальность названий товаров в каждой строке абсолютная.
Отредактированно Валет-69 (08.08.2016 13:52:57)
Неактивен
Валет-69 написал:
Внушает опасение, что надо работать с двумя базами. Из одной вытащить, а в другую вставить.
В обеих операциях должны участвовать две таблицы, но с одним и тем же именем Message321.
`имя базы данных`.`имя таблицы`.`имя поля`
Валет-69 написал:
Что Вы предлагаете? Как бы Вы решили задачу? Можно описать подробнее Ваш способ.
Давайте предположим, что уникальность названий товаров в каждой строке абсолютная.
UPDATE t1,t2 SET t1.image=t2.image.price, t1.Preview=t2.Preview
WHERE t1.name=t2.name AND ваше условие на непустые значения полей;
и не забудьте сделать резервное копирование
Неактивен
Т. е. во второй таблице все поля должны стать идентичными полям в первой?
Это совершенно неприемлемо. В новой таблице записей в четыре раза больше.
Она создана не вручную, целиком с помощью синхронизации сайта с "1С".
Внести сведения о старых путях к картинкам надо только в полях Image и Preview.
И не во всех записях.
Неактивен
Валет-69 написал:
Т. е. во второй таблице все поля должны стать идентичными полям в первой?
Почему?
Изменится только
SET t1.image=t2.image.price, t1.Preview=t2.Preview
и только там где
t1.name=t2.name AND ваше условие на непустые значения полей
Неактивен
Задача стояла вывести все строки из поля name в базе user13764_1, значения которых идентичны значениям в строках поля тоже name, но в базе user13764_2
Запрос составлен верно?
SELECT `name` FROM user13764_1.Message510 WHERE `name` IN (SELECT `name` FROM user13764_2.Message510);
Неактивен
Валет-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);
да
Неактивен