2013-02-06 71 views
0

假設我有以下表格:如何執行以下MySQL連接?

TABLEA

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

tableB的

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」列而不必使用遊標?

+0

最後的結果應該是約翰| 6 |西班牙| 2 –

+0

如果您提供創建語句和示例數據轉儲;反應會更快。年齡在國家桌上做什麼? – SparKot

回答

1

以前的答案是正確的,但忽略了幾個在你處理這個問題的方式問題。

您應該在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; 
+0

爲設計課+1 ;-) – SparKot

+0

我不明白你的意思是「年齡到該國家的人」。 –

+0

「該人訪問該國的年齡」 – Rolando

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