Заполнение большего количества полей в зависимости от конкретных элементов в базе данных MySQL - PullRequest
0 голосов
/ 23 февраля 2012

Чтобы заполнить определенное поле в функции номера телефонного префикса этой таблицы

 ___________________________________________________________
 |  id  |   telnum   |   name   |   country   |  continent |
 -----------------------------------------------------------
 |  01  | 003912377  |   Smith  |   Italy     |            |
 |  02  | 004412345  |   White  |    UK       |            |
 |  03  | 005454321  |   Lopez  |  Argentina  |            |

Я использую следующий код:

UPDATE telcountry_table
SET country =
CASE 
   WHEN left(telnum,4) = 0093 THEN 'Afghanistan'
   WHEN left(telnum,5) = 00355 THEN 'Albania'
   WHEN left(telnum,5) = 00213 THEN 'Algeria'
   .
   .
   .
   ELSE ''
END

Он работает отлично.Теперь у меня вопрос: могу ли я добавить дополнительные строки в том же коде, чтобы заполнить другие поля, такие как (в этом примере) конкретный континент, или мне нужно сделать другой другой запрос?

ВВ нескольких словах моя проблема: когда префикс "0044", код должен написать элемент "UK" в поле Country, элемент "EUROPE" в поле Continent ... и т. д.

Спасибо.

1 Ответ

0 голосов
/ 23 февраля 2012

Я не думаю, что ваша текущая модель данных является оптимальной / нормализованной, и причина, по которой ОБНОВЛЕНИЕ так озадачивает.Чтобы ОБНОВЛЕНИЕ работало, вам понадобится предложение WHERE для фильтрации «id», который вы хотите обновить;результат заявления CASE, напр.id = 02 когда оставлено (telnum, 4) = 0044. Для этого вам нужно будет создать хранимую процедуру (одним из решений является использование курсора).

Однако я бы предложил альтернативный нормализованный дизайнчто-то вроде следующего:

Я предполагаю, что в каждой стране может быть много префиксов (кодов городов):

create table areacodes
(
  id int auto_increment primary key,
  areacode varchar(10),
  fkCountry int
);
insert into areacodes(areacode,fkCountry)
values
('0039',1),('00441',2),('0054',3);

create table countries(
  id int auto_increment primary key,
  country varchar(20)
 );
 insert into countries(country)
 values('Italy'),
 ('UK'),('Algeria');

 create table continents(
 id int auto_increment primary key,
 continent varchar(20));

 insert into continents(continent)
 values('Europe'),('North America'),('Asia'),
 ('Australia'),('Africa'),
 ('South America'), ('Antartica');

Следующая таблица связывает страны с континентами:

create table country_continent(
fkCountry int,
fkContinent int);

insert into country_continent(fkCountry,fkContinent)
values(1,3),(2,1),(3,5),(4,1),(5,1),(6,6)

Наконец, таблица telcountry.Вам нужно будет отделить ареакод от телнума и сохранить их обоих.Затем вы можете найти страну и континент с помощью ареакода.

create table telcountry_table(
  id int,
  areacode varchar(10),
  telnum varchar(20),
  name varchar (50)
);
insert into telcountry_table(id,areacode,telnum,name)
values
(1,'0039','234244','Di Maggio'),
(2,'00441','2345','White'),
(3,'0054','54321','Sergio');

Вы можете найти страну и континент следующим образом:

select country 
from areacodes a join countries c
on c.id = a.fkCountry
where areacode = '00441'

И континент:

select continent 
from country_continent cc join continents c
on cc.fkContinent = c.id
where cc.fkCountry =
(
select c.id 
from areacodes a join countries c
on c.id = a.fkCountry
where areacode = '00441'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...