假设我有三个表在我的数据库,代表一个层次顺序完成丢失数据到一个国家。这很容易在数据库中表示。MySQL的:</p> <p><code>countries</code>,<code>states</code>,并<code>cities</code></p> <p>每个城市都连接到一个状态,每种状态:与父表
让我们进一步假设每个表包含一个字段tax_rate
。在基本情况下,税率在国家层面上定义,在所有其他层面上定义为null
。但是,它可能会覆盖下面的任何级别。
当我查询城市节点时,我想获得它的税率。它可以在同一节点内定义,但更有可能在下一个更高级别上定义。
什么是最有效的方式来完成这在MySQL或PHP级别?在我的现实生活中,不会只有一个这样的领域,但其中有很多。
下面是我的示例的简单数据库模式。当然它也会有外键定义。
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');
可能你可以加入表格,并从右表中选择使用mysql IF语句的列 – Ejaz 2013-04-04 13:27:50