通常對我來說,明顯的答案是「多個連接」。但是,情況如下: 我有一張桌子,上面有幾個條目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);
你應該用子查詢來訣竅....發佈你的表結構和所需的輸出 – Hackerman 2013-04-25 01:13:50
也顯示一些「循環」的例子。有可能是可以清理的東西。成千上萬的條目並不是很多條目。現在大多數處理器每秒處理數十億次循環。 – 2013-04-25 01:18:44
增加了信息。 – fruitcup 2013-04-25 01:23:54