Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:使用父表完成缺少的数据_Php_Mysql_Database_Database Design - Fatal编程技术网

Php MySQL:使用父表完成缺少的数据

Php MySQL:使用父表完成缺少的数据,php,mysql,database,database-design,Php,Mysql,Database,Database Design,假设我的数据库中有三个表,表示层次顺序: 国家、州、城市 每个城市与一个州相连,每个州与一个国家相连。这很容易在数据库中表示 让我们进一步假设这些表中的每一个都包含一个字段tax\u rate。在基本情况下,税率在国家一级定义,在所有其他级别定义null。但是,它可以在以下任何级别上被覆盖 当我查询城市节点时,我希望得到它的税率。它可以在同一个节点中定义,但更可能在下一个更高级别上定义 在MySQL或PHP级别上实现这一点最有效的方法是什么?在我的实际应用程序中,这样的字段不仅有一个,而且有很多

假设我的数据库中有三个表,表示层次顺序:

国家
、城市

每个城市与一个州相连,每个州与一个国家相连。这很容易在数据库中表示

让我们进一步假设这些表中的每一个都包含一个字段
tax\u 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');

使用COALESCE()。这就是它的用途。

使用COALESCE()。这就是它的用途。

这可以在任何一个级别上处理: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

如果不为空,则返回城市的税率,否则返回州的税率。如果该值也为空,它将返回国家的税率。

这可以在任何一个级别上处理: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

如果不为空,则返回城市的税率,否则返回州的税率。如果该值也为空,它将返回国家的税率。

谢谢,我不知道COALESCE()。谢谢,我不知道COALESCE()。可能是您可以使用mysql If语句加入表并从右表中选择列可能是您可以使用mysql If语句加入表并从右表中选择列