0

假设我有以下表格:

表A

a_name | age | country
Jordan | 5 | Germany
Molly | 6 | Spain
Paris | 7 | France
John | 7 | Saudi Arabia
John | 5 | Saudi Arabia
John | 6 | Spain

表B

id (auto increment primary key) | age | country
1 | 5 | Germany
2 | 6 | Spain
3 | 7 | France
4 | 7 | Spain
5 | 8 | France
6 | 9 | France
7 | 2 | Mexico
8 | 7 | Saudi Arabia
9 | 5 | Saudi Arabia

我希望能够在我能够得到的地方进行某种选择:

表A

a_name | age | country | id
Jordan | 5 | Germany | 1
Molly | 6 | Spain | 2
Paris | 7 | France | 3
John | 7 | Saudi Arabia | 8
John | 5 | Saudi Arabia | 5
John | 6 | Spain | 4

迭代地,我通过查找 tableB 中年龄和国家对的内容来填写“id”字段中的内容。是否有一些 SQL 查询/查询可以添加基于表 B 的新“id”列而无需使用游标?

4

2 回答 2

1
select a.a_name, a.age, a.country, b.id
FROM tableA a
JOIN tableB b on a.age = b.age and a.country = b.country

SqlFiddle

于 2013-02-06T22:36:02.503 回答
1

前面的答案是正确的,但忽略了您处理问题的方式中的几个问题。

您应该让表中的字段Country引用您的表:这样您就不会复制信息(当一个国家/地区更改其名称时,您的设计会发生什么?)。存储人们的年龄也是一个糟糕的选择:您应该存储出生日期(或年份),以避免重新计算他​​们的年龄。country_idkids

儿童桌:

name | DOB         | country_id | id
Joe  | Aug 11 2005 | 1          | 1
Jim  | Sep 09 2007 | 21         | 2

国家表:

id | name
1  | UK
2  | Germany

那么你需要的select语句是:

select kids.name, kids.DOB, countries.name, kids.id from kids join countries on kids.country_id = countries.id

然后,您可以计算应用程序中的年龄,也可以将计算合并到 SQL 中,参见(例如)http://ma.tt/2003/12/calculate-age-in-mysql/

编辑

在阅读了您的说明后,年龄列是该人访问该国时的年龄,我建议改为三表设计,仍然遵循存储日期而不是年龄的相同原则,并且只存储每个数据项一次:

人员表

结构

CREATE TABLE `countries` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(22) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB;

示例内容

id | name  | DOB
1  | Joe   | 2005-08-11
2  | Jim   | 2007-09-09
3  | Carol | 2008-01-22

国家表

结构

CREATE TABLE `countries` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(22) NOT NULL DEFAULT '',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB;

样本数据

id | name
1  | UK
2  | Germany
3  | Saudi Arabia

访问表

结构

CREATE TABLE `visits` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `person_id` int(11) unsigned NOT NULL,
 `country_id` int(11) unsigned NOT NULL,
 `date_of_visit` date NOT NULL,
 PRIMARY KEY (`id`),
 KEY `person_id` (`person_id`),
 KEY `country_id` (`country_id`),
 CONSTRAINT `visits_ibfk_1` FOREIGN KEY (`person_id`) REFERENCES `people` (`id`),
 CONSTRAINT `visits_ibfk_2` FOREIGN KEY (`country_id`) REFERENCES `countries` (`id`)
) ENGINE=InnoDB;

样本数据

id | person_id | country_id | date_of_visit
1  | 1         | 1          | 2009-01-02
2  | 1         | 2          | 2010-01-01

那么你需要得到你想要的数据的查询是:

select 
 people.name, 
 people.DOB, 
 countries.name, 
 visits.date_of_visit 
from 
 visits 
  join 
 countries 
  on 
   visits.country_id = countries.id
  join 
 people
  on
   visits.person_id = people.id;
于 2013-02-06T22:55:32.177 回答