根据MySQL数据库中特定元素的功能填充更多字段

时间:2012-02-23 00:53:28

标签: mysql sql

根据此表的电话前缀号填充特定字段

 ___________________________________________________________
 |  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”时,代码必须在字段Country中写入元素“UK”,在Continent字段中写入“EUROPE”元素......依此类推。

感谢。

1 个答案:

答案 0 :(得分:0)

我不认为您当前的数据模型是最优/标准化的,并且UPDATE令人费解的原因。为了使UPDATE正常工作,您需要一个WHERE子句来过滤您想要更新的“id”; CASE声明的结果,例如。当离开时,id = 02(telnum,4)= 0044.为此,您需要创建一个存储过程(一种解决方案是使用游标)。

但是,我会建议一种替代的标准化设计,如下所示:

我假设每个国家/地区可以有许多telnum前缀(区号):

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表。您需要将areacode与telnum分开并保存它们。然后,您可以使用areacode检索国家/地区。

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'
)