假设我的数据库中有三个表,表示一个分层次序:
countries
,states
和cities
每个城市都与一个州相连,每个州与一个国家相连。这很容易在数据库中表示。
让我们进一步假设这些表中的每一个都包含一个字段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');
答案 0 :(得分:2)
使用COALESCE()。这就是它的用途。
答案 1 :(得分: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,这将返回城市的税率,否则为州。如果该值也为空,则会返回该国家/地区的税率。