前面的答案是正确的,但忽略了您处理问题的方式中的几个问题。
您应该让表中的字段Country
引用您的表:这样您就不会复制信息(当一个国家/地区更改其名称时,您的设计会发生什么?)。存储人们的年龄也是一个糟糕的选择:您应该存储出生日期(或年份),以避免重新计算他们的年龄。country_id
kids
儿童桌:
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;