2013-04-25 57 views
0

通常對我來說,明顯的答案是「多個連接」。但是,情況如下: 我有一張桌子,上面有幾個條目tableA。 我有另外一張桌子上有幾千個條目tableB。每個條目都有一個與tableA中某一行的id相關的數字。 tableB中將有多行與tableA中的單個行一起使用。 將會有第三個表tableC,包含數萬個條目。它將有多個行對應tableB中的單個行。多個MySQL查詢或一個有多個JOIN?

的查詢可能是這個樣子:(具體不真的那麼重要)

SELECT tableA.*, tableB.*, tableC.* LEFT JOIN tableB ON tableB.idA = tableA.id LEFT JOIN tableC ON tableC.idB = tableB.id WHERE tableA.id = some_number; 

這個工程很好,很正常,但我得到噸,因爲加入的重複行。 我想要tableA的一個結果,tableB的幾個結果以及tableC的幾個結果。

不幸的是,我使用了很多嵌套的PHP數組和for循環。它變得混亂,所以我想知道是否應該使用3個單獨的查詢來擺脫所有嵌套的PHP循環,或者如果我應該堅持JOINS?

附加信息: 「表A」:工作 ID(主鍵) 名 描述 日期 小時 客戶 狀態

「tableB的」:工作 ID(主鍵) 工作(與作業中的行ID相關) 概要 描述 日期

「表C」:次 ID(主鍵) 工作(在工作列上的ID相關聯) 開始 結束

所需的輸出: 我真的不知道什麼樣的格式將是最好的。我想要一份工作排,附帶一份工作清單,以及每份工作的時間清單。

嵌套循環的示例: $ work是一個具有兩個值的數組。第一個是一系列作品,第二個是一系列時間。

foreach ($work[0] as $workk=>$workv) { 
    echo("<div><h1>" . $workk . ": " . $workv["summary"] . "</h1><br/>Job: " . $workv["job"] . "</br>Date: " . $workv["date"] . "<br>Description:" . $workv["description"] . "<br/>Times:<br/>"); 
    foreach ($work[1] as $workid=>$times) { 
     if ($workid == $workk) { 
      foreach ($times as $time) { 
       echo("Start: " . $time[0] . " | End: " . $time[1]); 
      } 
      break; 
     } 
    } 
} 

我得到使用此代碼「工作」陣列功能(其中$查詢 - >結果()是從長JOIN查詢行)

foreach ($query->result() as $row) { 
       if (!array_key_exists($row->id, $work)) { 
        $work[$row->id] = array("job"=>$row->job, "summary"=>$row->summary, "description"=>$row->description, "date"=>$row->date); 
       } 
       $times[$row->id][] = array($row->start, $row->end); 
      } 
      return array($work, $times); 
+0

你應該用子查詢來訣竅....發佈你的表結構和所需的輸出 – Hackerman 2013-04-25 01:13:50

+0

也顯示一些「循環」的例子。有可能是可以清理的東西。成千上萬的條目並不是很多條目。現在大多數處理器每秒處理數十億次循環。 – 2013-04-25 01:18:44

+0

增加了信息。 – fruitcup 2013-04-25 01:23:54

回答

1

你有兩種方式*查詢DB:

  1. 將所有數據與兩個左連接一起獲取。
  2. 獲取主數據並按需加載詳細信息。

* 不要單獨加載所有的三個表,然後嘗試將其在PHP鏈接

第一種方法可能需要更長的時間,在第一次加載,但加載數據會有不再需要數據庫調用。另一方面,雖然可能很容易將數據顯示爲表格(使用重複的主數據),但這通常不是所需的用戶界面。除非您使用特殊的UI組件來自動處理主要細節,否則將錶轉換爲更明智的表單(在這種情況下爲您的循環)可能會有一些困難。

您的問題實際上是一個UI設計問題,因爲如何顯示兩級主細節。有很多UI模式可以顯示主控細節。

例如,您只能在下拉列表中加載第一級(表A)並查詢數據庫並在下拉更改中顯示第二級。或者你可以有一個像結構一樣的樹來查詢數據庫崩潰。

看看this link,得到一些想法。您也可以嘗試搜索php的主從細節UI組件。

+0

謝謝你解釋我的選擇,以及文章。我不確定我將要做什麼,但這清除了事情。 – fruitcup 2013-04-27 04:13:19