以前的答案是正確的,但忽略了幾個在你處理這個問題的方式問題。
您應該在kids
表中使用country_id
字段引用Country
表:這樣您就不會複製信息(當您的設計改變名稱時會發生什麼?)。通過存儲人的年齡,你也是一個糟糕的選擇:你應該存儲出生日期(或年份),以避免重新計算他們的年齡。
兒童表:
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/
編輯
讀你的澄清,年齡列是人在他們的國家訪問的時候歲以後,我會建議一個三表設計代替,仍然繼的相同的原則存儲日期,不是年齡,只有存儲數據的每個項目一次:
People表
結構
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
Countries表
結構
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;
最後的結果應該是約翰| 6 |西班牙| 2 –
如果您提供創建語句和示例數據轉儲;反應會更快。年齡在國家桌上做什麼? – SparKot