У меня есть база данных, состоящая из:
loaddata_temp
Стол (мой основной стол);error_data
Таблица;company_category
Таблица;company_industry
Таблица;company_level
Таблица;company_type
Таблица;вот мой основной стол (loaddata_temp
)
company_id company_name company_parent_id company_type_id company_category_id company_industry_id company_level_id
---------- ----------------------------------- ----------------- --------------- ------------------- ------------------- ----------------
2 A Plus Lawn Care 0 Partner PT ATL Head office
3 A. L. Price 0 Partner CV ATL Head office
4 A.J. August Fashion Wear 0 Partner UD ATL Head office
5 A+ Electronics 0 Partner KOPERASI LAT Head office
6 A+ Investments 0 Customer Warung AAA CITY OFFICE
7 Aaronson Furniture 0 OTHER PT ATL Head office
8 ABC Markets 0 Test CV ATL Head office
основная таблица имеет 8 столбцов первичного ключа.company_parent_id
,company_category_id
и так далее (каждый столбец, содержащий _id, является primary_key)
вот одна из моих справочных таблиц
company_type_id company_type_description
--------------- ------------------------
1 Costumer
2 Partner
3 Other
18 Competitor
Справочная информация о том, что мне нужно для импорта данных из CSV в Mysql:
Я следую этому коду, чтобы импортировать тысячи данных из CSV.
ссылка выше действительно помогает мне улучшить мой запрос (спасибо Dawn Rossi)
перед вставкой в реальную таблицу (company
), мне нужно проверить или преобразовать первичный ключ в loaddata_temp
в id.refference из другой таблицы, как company_category
,company_industry
и так далее.
поэтому я сделал следующий код ниже.
$sql_updates[]="UPDATE company
LEFT JOIN loaddata_temp
ON company.company_name = loaddata_temp.company_name
SET loaddata_temp.company_name = COALESCE( concat('Error Found Duplicate ',loaddata_temp.company_name),loaddata_temp.company_name)";
$sql_updates[]="UPDATE loaddata_temp
LEFT JOIN demography_country
ON demography_country.demography_country_name = loaddata_temp.demography_country_id
SET loaddata_temp.demography_country_id = COALESCE(demography_country.demography_country_id, concat('Error ',loaddata_temp.demography_country_id,' Your Country Not In the List'))";
$sql_updates[]="UPDATE loaddata_temp
LEFT JOIN demography_city
ON demography_city.demography_city_name = loaddata_temp.demography_city_id
SET loaddata_temp.demography_city_id = COALESCE(demography_city.demography_city_id,concat('Error ',loaddata_temp.demography_city_id,' : Your city Not In the List'))";
$sql_updates[]="UPDATE loaddata_temp
LEFT JOIN demography_provinces
ON demography_provinces.demography_province_name = loaddata_temp.demography_province_id
SET loaddata_temp.demography_province_id = COALESCE(demography_provinces.demography_province_id, concat('Error ',loaddata_temp.demography_province_id,' : Your Province Not In the List'))";
$sql_updates[]="UPDATE loaddata_temp
LEFT JOIN company_type
ON company_type.company_type_description = loaddata_temp.company_type_id
SET loaddata_temp.company_type_id = COALESCE(company_type.company_type_id, concat('Error ',loaddata_temp.company_type_id,' : Your company Type Not In the List'))";
$sql_updates[]="UPDATE loaddata_temp lt
LEFT JOIN company_category cc
ON cc.company_category_description = lt.company_category_id
SET lt.company_category_id = COALESCE(cc.company_category_id, concat('Error ',lt.company_category_id,' : Your Company Category Not In the List'))";
$sql_updates[]="UPDATE loaddata_temp
LEFT JOIN company_level
ON company_level.company_level_description = loaddata_temp.company_level_id
SET loaddata_temp.company_level_id = COALESCE(company_level.company_level_id, concat('Error ',loaddata_temp.company_level_id,' : Your Company Level Not In the List'))";
$sql_updates[]="UPDATE loaddata_temp
LEFT JOIN company_industry
ON company_industry.company_industry_short_description = loaddata_temp.company_industry_id
SET loaddata_temp.company_industry_id = COALESCE(company_industry.company_industry_id, concat('Error ',loaddata_temp.company_industry_id,' : Your Company Industry Not In the List'))";
из кода выше, результат
company_id company_name company_parent_id company_type_id company_category_id company_industry_id company_level_id
---------- ----------------------------------- ----------------- --------------- ------------------- ------------------- ----------------
2 A Plus Lawn Care 0 2 3 1 1
3 A. L. Price 0 1 4 5 1
4 A.J. August Fashion Wear 0 2 5 7 1
5 A+ Electronics 0 2 23 Error 1
6 A+ Investments 0 1 Error Error Errror
7 Aaronson Furniture 0 3 3 1 1
8 ABC Markets 0 ERROR 4 1 1
из приведенного выше результата, мне нужно отделить (переместить) данные с ошибкой в таблицу error_data
со следующим кодом.
INSERT INTO error_data
SELECT * FROM loaddata_temp
WHERE SUBSTRING_INDEX(company_name,' ',1)='Error' or
company_category_id REGEXP '^[A-Za-z \:]+$' OR
company_type_id REGEXP '^[A-Za-z \:]+$' OR
company_industry_id REGEXP '^[A-Za-z \:]+$' OR
company_level_id REGEXP '^[A-Za-z \:]+$' OR
demography_city_id REGEXP '^[A-Za-z \:]+$' OR
demography_country_id REGEXP '^[A-Za-z \:]+$' OR
demography_province_id REGEXP '^[A-Za-z \:]+$'
DELETE FROM loaddata_temp
WHERE SUBSTRING_INDEX(company_name,' ',1)='Error' or
company_category_id REGEXP '^[A-Za-z \:]+$' OR
company_type_id REGEXP '^[A-Za-z \:]+$' OR
company_industry_id REGEXP '^[A-Za-z \:]+$' OR
company_level_id REGEXP '^[A-Za-z \:]+$' OR
demography_city_id REGEXP '^[A-Za-z \:]+$' OR
demography_country_id REGEXP '^[A-Za-z \:]+$' OR
demography_province_id REGEXP '^[A-Za-z \:]+$'
Теперь в таблице loaddata_temp нет ошибки данных, поскольку она уже перемещена в таблицу error_data (см. Таблицу ниже).
company_id company_name company_parent_id company_type_id company_category_id company_industry_id company_level_id
---------- ----------------------------------- ----------------- --------------- ------------------- ------------------- ----------------
5 A+ Electronics 0 2 23 Error 1
6 A+ Investments 0 1 Error Error Errror
8 ABC Markets 0 ERROR 4 1 1
Эта проблема
мне нужен запрос для отката таблицы error_data в таблицу ссылок или исходные данные без идентификатора (см. ниже)
Идентификатор компании Идентификатор компании Идентификатор компании Родительский идентификатор компании Тип_идентификатора_идентификатора компании Идентификатор компании
5 A+ Electronics 0 partner 23 Error 1
6 A+ Investments 0 costumer Error Error Errror
8 ABC Markets 0 ERROR 4 1 1
Мне нужно предложение обо всем моем коде выше, чтобы сделать его красивее и иметь хорошую производительность.
Если есть какая-либо ссылка ссылки, связанные с моей проблемой, пожалуйста, сообщите мне.
Ваша помощь с благодарностью!
Давайте посмотрим, смогу ли я перефразировать вопрос … У вас есть файл CSV со строками (например, «Главный офис»), и вы хотите нормализовать эти значения в соответствии с таблицей нормализации, превратив эту строку в число (например, «3»). «)?
Далее файл CSV может есть новые строки, так что вам нужно INSERT
новые пары строка-номер в таблице нормализации?
Затем вы хотите создать (или добавить) таблицу, в которой есть только идентификаторы (например, «3»), а не строки («Главный офис»).
Я обсуждаю очень эффективное решение 2-SQL для этой задачи в мой блог. Первый SQL обнаруживает и вставляет любые новые строки (INSERT ... SELECT ... LEFT JOIN ...
). Второй обнаруживает все идентификаторы (UPDATE ... JOIN ... SET ...
).
(Если это не суть вашего вопроса, то я должен жаловаться на отсутствие простоты / ясности.)
Других решений пока нет …