前の回答は正しいですが、問題にアプローチする方法でいくつかの問題を無視しています。
テーブル内のフィールド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 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/を参照してください。
編集
年齢列はその国を訪れたときの年齢であるというあなたの説明を読んだ後、代わりに3つのテーブルのデザインを提案します.年齢ではなく日付を保存し、それぞれのみを保存するという同じ原則に従います. 1 回のデータ項目:
人物表
構造
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;