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」フィールドの内容を繰り返し入力します。カーソルを使用せずに、テーブル B の列に基づく新しい「id」列を追加するために実行できる SQL クエリ/クエリはありますか?

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 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;
于 2013-02-06T22:55:32.177 に答える