2012-03-07 8 views
6

Я имею дело с телефонной системой и должен работать с несколькими поставщиками услуг. Для одного поставщика У меня есть таблица MySQL country_codes, как это -Обновление конкретных записей таблицы MySQL

--------------------------------------------------------- 
country_code | area_code | country 
--------------------------------------------------------- 
93   | 93   | Afghanistan 
0    | 9375  | Afghanistan Cellular-AT 
0    | 9370  | Afghanistan Cellular-AWCC 
355   | 355  | Albania 
0    | 35568  | Albania Cellular-AMC 
0    | 35567  | Albania Cellular-Eagle 
213   | 213  | Algeria 
0    | 21377  | Algeria Cellular-Djezzy 
0    | 2135  | Algeria Cellular-Wataniya 
--------------------------------------------------------- 

и так далее ...

Колонка country_code не было раньше, но я добавил это, так как мне нужно было это для моего PHP приложения. Мне удалось обновить коды стран для некоторых записей (используя ответ из моего предыдущего вопроса здесь)

Я хочу добиться того, чтобы заменить 0 на соответствующий код страны. Стол должен выглядеть так:

--------------------------------------------------------- 
country_code | area_code | country 
--------------------------------------------------------- 
93   | 93   | Afghanistan 
93   | 9375  | Afghanistan Cellular-AT 
93   | 9370  | Afghanistan Cellular-AWCC 
355   | 355  | Albania 
355   | 35568  | Albania Cellular-AMC 
355   | 35567  | Albania Cellular-Eagle 
213   | 213  | Algeria 
213   | 21377  | Algeria Cellular-Djezzy 
213   | 2135  | Algeria Cellular-Wataniya 
--------------------------------------------------------- 

Надеюсь, я достаточно хорошо себя объяснил. Любая идея, как я могу это сделать с PHP-MySQL?

(я не против использовать PHP код для управления таблицами этот путь)

+0

Вы можете использовать связь между area_code и country_code для заполнения country_code (часть area_code - ваш country_Code) –

+0

Мне нужно немного больше информации. Как мы можем сказать, что делает действительный код страны? Поскольку они иногда являются 2-значными, а иногда и 3-значными, мы не можем просто отрубить конец кода области. У вас уже есть все действующие коды стран, введенные хотя бы один раз в течение 28 000 записей? – Andrew

+0

Похоже, что каждая «компания» имеет код города, который начинается с кода района, присвоенного «стране», правильно? Эта модель работает со всем набором данных? –

ответ

6

Попробуйте этот запрос -

UPDATE country_codes 
SET country_code := @c := IF(@c IS NOT NULL AND country_code = 0, @c, country_code) 
ORDER BY CAST(area_code AS CHAR) 
+0

country_code может быть не менее 1 цифры и максимум 4 цифры – skos

+0

SUBSTRING (area_code, 1, 3) не вернет более трех символов (цифр), а также вернет emp ty в случае пустого 'area_code'. У вас есть пустой 'area_code'? – Devart

+0

Нет 'area_code' никогда не может быть пустым – skos

0

Что-то, как это должно работать, если у вас есть база данных под названием «TESTDB» и стол под названием «footable».

$link = mysql_connect("localhost", "username", "password1234"); 
mysql_select_db("testdb", $link); 

$result = mysql_query("UPDATE footable SET country_code="93" WHERE country LIKE Afghanistan%", $link); 
$result = mysql_query("UPDATE footable SET country_code="355" WHERE country LIKE Albania%", $link); 

mysql_close($link); 
+1

Я считаю, что это противоположность того, что просит @ Сахин. –

+0

@Adam. В этой таблице есть еще много стран, что он показал только примерные данные. –

+0

@NaveenKumar Рассмотрим случай, когда страна является «UK-Orange» и код страны i 0, но единственная существующая запись - «Великобритания» ... Если данные просты и предсказуемы, то автоматизированный подход «угадывания» может быть принято, но это редко происходит в реальном мире. – Adam

2
update cc set 
    country_code = t.country_code 
from country_codes cc 
join (
    select country_code, country, char_length(trim(cast(country_code as char))) as code_len 
    from country_codes 
    where country_code <> 0 
) t on 
    t.country_code = cast(substr(cast(cc.area_code as char), 1, t.code_len) as signed integer) and 
    cc.country_code = 0 and 
    cc.country like concat(t.country, '%') 

Я добавил cc.country like concat(t.country, '%') кондиционировать, чтобы быть более конкретными, но предполагается, что каждое имя сети сотовой связи начинается с его названием страны - так, если это не так опускает.

Добавлено после @Sachyn комментарий:

Тестовый код используется на SQLZOO работает отлично, это только для тестирования, это не запрос на обновление:

select cc.*, t.country_code as new_country_code 
from (
    select 93 as country_code, 93 as area_code , 'Afghanistan' as country union 
    select 0 , 9375 , 'Afghanistan Cellular-AT' union 
    select 0 , 9370 , 'Afghanistan Cellular-AWCC' union 
    select 355, 355 , 'Albania' union 
    select 0 , 35568, 'Albania Cellular-AMC' union 
    select 0 , 35567, 'Albania Cellular-Eagle' union 
    select 213, 213 , 'Algeria' union 
    select 0 , 21377, 'Algeria Cellular-Djezzy' union 
    select 0 , 2135 , 'Algeria Cellular-Wataniya' 
) cc 
join (
    select country_code, country, char_length(rtrim(cast(country_code as char))) as code_len 
    from (
     select 93 as country_code, 93 as area_code , 'Afghanistan' as country union 
     select 0 , 9375 , 'Afghanistan Cellular-AT' union 
     select 0 , 9370 , 'Afghanistan Cellular-AWCC' union 
     select 355, 355 , 'Albania' union 
     select 0 , 35568, 'Albania Cellular-AMC' union 
     select 0 , 35567, 'Albania Cellular-Eagle' union 
     select 213, 213 , 'Algeria' union 
     select 0 , 21377, 'Algeria Cellular-Djezzy' union 
     select 0 , 2135 , 'Algeria Cellular-Wataniya' 
    ) c 
    where country_code <> 0 
) t on 
    t.country_code = cast(substr(cast(cc.area_code as char), 1, t.code_len) as signed integer) and 
    cc.country_code = 0 and 
    cc.country like concat(t.country, '%') 
+0

Спасибо Michal Я пробовал, но он дает мне эту ошибку '# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'from country_codes cc join (выберите country_code, country, char_length (обрезка (' в строке 3' – skos

+0

Это правильный подход, учитывая, что указанные предположения верны - вам просто нужно играть с синтаксисом, чтобы заставить его работать. – Stevo

+0

@Sachyn вы используете этот запрос как есть? Я его протестировал и должен работать нормально. Попробуйте мою последнюю версию, возможно, что-то изменилось за это время. –

0

Вы можете создать таблицу с countries по LY, т.е .:

INSERT INTO countries (country_code,country) 
SELECT country_code,country FROM country_codes WHERE country_code=0 

Затем вы можете легко обновить таблицу

UPDATE country_codes cc, countries c 
SET cc.country_code = c.country_code 
WHERE LOCATE(c.country,cc.country)=1 AND cc.country_code=0 

Я не проверял, но я полагаю, вы можете получить точку.

1

Если вам нужно, чтобы сделать Зафиксировать данные только один раз, вы можете попробовать этот подход:

0) Резервное копирование данных, или лучше, выполнить запрос на копию данных.

1) Создает таблицу, содержащую ненулевые коды стран. Нам нужна отдельная таблица, потому что он говорит в MySQL инструкции, что:

В настоящее время вы не можете обновить таблицу и выбрать из той же таблицы в подзапрос.

CREATE TABLE country_codes_list (
    country_code INT NOT NULL PRIMARY KEY 
); 

INSERT INTO country_codes_list 
SELECT country_code 
FROM country_codes 
WHERE country_code <> 0; 

2) Обновить все строки, в которых код страны равен 0, находя код страны, который совпадает с началом кода региона:

UPDATE country_codes AS country_codes_zero SET country_code = (
    SELECT country_code 
    FROM country_codes_list 
    WHERE country_codes_list.country_code = SUBSTRING(country_codes_zero.area_code, 1, LENGTH(country_codes_list.country_code)) 
) WHERE country_code = 0; 

Это может быть очень медленным запрос, поскольку он использует сопутствующий подзапрос. Но он должен фиксировать данные за один раз.

Смежные вопросы