2016-05-18 16 views
0

我試圖組織使用PHP和MySQL數據庫中的一些數據。如何組織SQL數據到與PHP訂單

我想顯示公司的位置和它們各自的子部門,建築物等

的清單,但我似乎無法正常組織的數據,我不能讓我的頭周圍應該怎麼做。

因此,層次結構可能會變得相當複雜,有7個不同層次,每個層次都有很多分支。

我試過將所有的數據集中在一張表中,但是我無法得到正確分組的區域。

我需要顯示按照下面的數據:

頂級[北] - (公司區)

-2nd水平[紐卡斯爾] - (區域位置)

--3rd級[結束大廈] - (您所在的位置大廈)

--- 4級[帳戶] - (建設部門)

---- 5級[FD辦公室] - (系辦公室)

--- 4級[管理員] - (建設部門)

---- 5級[OM辦公室] - (部門辦公室)

-2nd水平[仔] - (區域位置)

--3rd水平[綠色建築] - (地點建築物)

--- 4級[科技] - (建設主管部門)

那麼,組織這個最好的方法是什麼,以便我可以將每個級別與其子級別一起分組?

我的想法是讓每個關卡都在數據庫表中,然後有另一個關聯關卡和他們的孩子的表格,但是我不知道如何組織它並獲取數據。

你能否在最好的方式上闡明任何亮點?

繼承人的單表我想

enter image description here

回答

0

恕我直言,最簡單的方法是將所有數據存儲在一個表中,有一個「父」字段中,指的它的ID的父級。空是它是根/頂層條目。

這是可以做到這樣:

while(($row = mysqli_fetch_assoc($res)) !== false) { 
    if ($row['parent_id'] !== null) { 
     $index[$row['parent_id']][] = $row; 
    } else { 
     $topLevel = $row; 
    } 
} 

function displayChildren($level_id, $index) { 
    foreach ($index as $children) { 

     usort($children, function($a, $b) { 
      return $a['level'] - $b['level']; 
     }); 

     foreach ($children as $child) { 
      if ($child['parent_id'] == $level_id) { 
       echo str_repeat('-', $child['level']); 
       echo $child['name']; 
       echo "<br />"; 
       displayChildren($child['id'], $index); 
      } 
     } 
    } 
} 

displayChildren($topLevel['id'], $index); 

這意味着代碼在同一級別內隨機順序,並在數據庫中的水平場。調優代碼以滿足您的需求完美:)

+0

呀這就是如何我試過了,但是如何組織數據以便我可以將所有級別與子女分組? – frobak

+0

你不能用MySQL來做到這一點。一些RDBMS如PostGreSQL可以做這種請求。對於你的情況,你將不得不使用PHP來構建你的樹。 – JesusTheHun

+0

好吧,我怎麼能將它們與php分組在一起,這就是即時通訊的問題,將關卡和他們的孩子分組在一起 – frobak

0

嘗試使用此創建一個表 -

CREATE TABLE IF NOT EXISTS `test_table` (
     `id` int(11) unsigned NOT NULL, 
     `name` varchar(55) COLLATE utf8_unicode_ci NOT NULL, 
     `parent_id` int(11) NOT NULL, 
     `level` int(11) NOT NULL 
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

-- 
-- Dumping data for table `test_table` 
-- 

INSERT INTO `test_table` (`id`, `name`, `parent_id`, `level`) VALUES 
(1, 'root1', 0, 0), 
(2, 'root2', 0, 0), 
(3, 'root1-level1', 1, 1), 
(4, 'root1-level2', 1, 2), 
(5, 'root2-level2', 2, 1), 
(6, 'root2-level3', 2, 2); 

創建後,您可以通過使用獲得的數據自join-

select t1.name as parent_name, t2.name, t2.level from test_table t1 join test_table t2 on t1.id = t2.parent_id order by t1.id 
+0

是的,這不起作用,它不與父母一起分揀孩子 – frobak