2013-04-04 66 views
0

假設我有三個表在我的數據庫,代表一個層次順序完成丟失數據到一個國家。這很容易在數據庫中表示。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'); 
+0

可能你可以加入表格,並從右表中選擇使用mysql IF語句的列 – Ejaz 2013-04-04 13:27:50

回答

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 

這將返回城市的稅率,如果它不爲空,否則國家。如果這也是空的,它將返回該國的稅率。

2

使用COALESCE()。這就是它的目的。

+0

謝謝,我不知道COALESCE()。 – sprain 2013-04-04 13:23:20

相關問題