0

データベースに、階層的な順序を表す 3 つのテーブルがあるとします。

countriesstates、およびcities

各都市は 1 つの州に接続され、各州は 1 つの国に接続されます。これは、データベースで簡単に表現できます。

さらに、これらの各テーブルに field が含まれているとしますtax_rate。基本的なケースでは、税率は国レベルおよびnullその他すべてのレベルで定義されます。ただし、以下のいずれかのレベルで上書きされる可能性があります。

都市ノードを照会するときに、その税率を取得したいと考えています。同じノード内で定義することもできますが、次の上位レベルのいずれかで定義される可能性が高くなります。

MySQLまたはPHPレベルでこれを達成する最も効率的な方法は何ですか? 私の実際のアプリケーションでは、そのようなフィールドは 1 つだけではなく、多数あります。

以下は、私の例の単純なデータベース スキーマです。もちろん、外部キー定義も含まれます。

CREATE TABLE `countries` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `tax_rate` float(4,2) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `countries` (`id`, `tax_rate`, `name`)
VALUES
    (1,8.00,'Switzerland'),
    (2,16.00,'Germany');


CREATE TABLE `cities` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `state_id` int(11) DEFAULT NULL,
  `tax_rate` float(4,2) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

NSERT INTO `cities` (`id`, `state_id`, `tax_rate`, `name`)
VALUES
    (1,1,NULL,'Bern'),
    (2,1,NULL,'Zollikofen'),
    (3,2,NULL,'Zurich'),
    (4,2,5.30,'Wettingen'),
    (5,2,NULL,'Winterthur'),
    (6,2,6.60,'Handligen'),
    (7,3,NULL,'Bayern-Town 1'),
    (8,3,NULL,'Bayern-Town 2'),
    (9,3,9.00,'Bayern-Town 3');


CREATE TABLE `states` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `country_id` int(11) DEFAULT NULL,
  `tax_rate` float(4,2) DEFAULT NULL,
  `name` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `states` (`id`, `country_id`, `tax_rate`, `name`)
VALUES
    (1,1,NULL,'Bern'),
    (2,1,9.00,'Zurich'),
    (3,2,NULL,'Bavaria');
4

2 に答える 2

2

COALESCE() を使用します。それがそのためです。

于 2013-04-04T13:17:53.693 に答える
1

これは、MySQL または PHP のいずれかのレベルで処理できます。

私はMySQLのアプローチを好むでしょう:

select cities.name, COALESCE(cities.tax_rate,states.tax_rate,countries.tax_rate) from cities
join states on cities.state_id=states.id
join countries on states.country_id = countries.id

これは、NULL でない場合は都市の税率を返し、それ以外の場合は州の税率を返します。それも null の場合、その国の税率が返されます。

于 2013-04-04T13:23:29.037 に答える