2013-10-12 141 views
2

我有一個問題,如果任何人都可以回答。請原諒我對此沒有經驗,但這是我嘗試的第一個項目,所有這些對我來說都是新的。我正在努力在使用php和mySQL的工作中建立一個庫存系統的過程,並且我已經就如何顯示當前借給人們的項目打了一道牆。MySQL查詢太多?

我有用於分配給用戶的項目分爲4類,這些項目的貸款記錄存儲在4個不同的表中。我還爲用戶提供了另一個表格,以及這些項目的表格及其特徵。

當我的頁面顯示時,需要將所有分配給每個用戶的項目分組在一張表中。關於如何做到這一點,我有兩個想法,但我不確定哪個是最好的方法。

我的第一個想法是從用戶表中提取所有用戶並將信息存儲到數組中,然後從4個貸款表中提取所有信息並將每個表存儲到一個數組中。從那裏,我會做類似

for($i=1;$i>sizeof($usersArray);$i++){ 
    for($a=1;$a>sizeof($loanTable1Array);$a++){ 
     if($userArray[$i][userID] == $loanTable1Array[$a][userID]{ 
      //list items 
     } 
    } 
    for($b=1;$b>sizeof($loanTable2Array);$b++){ 
     if($userArray[$i][userID] == $loanTable2Array[$b][userID]{ 
      //list items 
     } 
    } 
    for($c=1;$c>sizeof($loanTable3Array);$c++){ 
     if($userArray[$i][userID] == $loanTable3Array[$c][userID]{ 
      //list items 
     } 
    } 
    for($d=1;$d>sizeof($loanTable4Array);$d++){ 
     if($userArray[$i][userID] == $loanTable4Array[$d][userID]{ 
      //list items 
     } 
    } 
} 

我與這雖然值得關注的是,我將有大約100-150用戶和每個表將有100個不同項目的平均水平。這意味着大約40,000到60,000次迭代循環。

我的另一個想法是從用戶表中拉出所有條目,然後使用這些數據在where語句中使用userID查詢其他4個表。但後來我讀到,如果你有一個循環查詢,那麼你做錯了。

$sql = "SELECT userID FROM users"; 
$allUsers = runQuery($sql); //data is sanitized before running the query 
for($i = 1; $i<sizeof($allUsers); $i++){ 
    $loan1sql = "SELECT * FROM loantable1 WHERE userID = {$allUsers[$i][$userID]}'"; 
    $loan1Items= runQuery($loan1sql); 
    for($a = 1; $a<sizeof($loan1Items); $a++){ 
     //list items 
    } 
    $loan2sql = "SELECT * FROM loantable2 WHERE userID = '{$allUsers[$i][$userID]}'"; 
    $loan2Items= runQuery($loan2sql); 
    for($b = 1; $b<sizeof($loan2Items); $b++){ 
     //list items 
    } 
    $loan3sql = "SELECT * FROM loantable3 WHERE userID = '{$allUsers[$i][$userID]}'"; 
    $loan3Items= runQuery($loan3sql); 
    for($c = 1; $c<sizeof($loan3Items); $c++){ 
     //list items 
    } 
    $loan4sql = "SELECT * FROM loantable4 WHERE userID = '{$allUsers[$i][$userID]}'"; 
    $loan4Items= runQuery($loan4sql); 
    for($d = 1; $d<sizeof($loan1Items); $d++){ 
     //list items 
    } 
} 

這樣做會在每次加載頁面時導致400 - 600次調用數據庫。有沒有人對我的最佳行動方案有什麼意見?任何幫助將不勝感激。

+3

絕對應該是**一個**查詢。你在問錯方式。你的第一個問題應該只用[sql]和[mysql]標記,要求正確的數據庫設計** –

+2

是的,你必須弄清楚你的數據庫設計。然後,您將使用JOIN將所有數據放入一個查詢中。結果將是您爲了創建表而創建的數組。 – cantaffordretail

+1

'JOIN' 4個表格,並用userID過濾它們 –

回答

2

通過考慮額外的category列,您可以有一個loantable而不是四個。然後,您只需使用表格中的一個查詢。

僅僅只是一種方式的例子來做到這一點:

-- Table structure for table `users` 

CREATE TABLE IF NOT EXISTS `users` (
    `userID` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`userID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

-- Dumping data for table `users` 

INSERT INTO `users` (`userID`) VALUES 
(1), 
(2); 

-- -------------------------------------------------------- 

-- Table structure for table `loantable` 

CREATE TABLE IF NOT EXISTS `loantable` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `category` int(11) NOT NULL, 
    `userID` int(11) NOT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 

-- Dumping data for table `loantable` 

INSERT INTO `loantable` (`ID`, `category`, `userID`) VALUES 
(1, 1, 1), 
(2, 2, 1), 
(3, 3, 1), 
(4, 1, 2), 
(5, 3, 2); 

那麼你就只用一個查詢,如:。

SELECT * 
FROM 
    `users` 
    LEFT OUTER JOIN loantable ON loantable.userID = users.userID 
WHERE 1 
ORDER BY 
    users.userID 
    ,category 
0

(請參閱上面的回答這是太久添加爲評論,但我認爲這將是有益的)

@cartalot和@Uours謝謝你! - 我曾考慮儘早爲所有貸款創建一張表,但不知道如何實施。儘管如此,這很有道理。我的整個問題是混淆了mySQL中的外鍵 - 父鍵約束,以及如何實際連接表來在頁面上顯示信息。

不是聽起來像一個完整的白癡,但我認爲這可能是有建設性的人閱讀這條道路。我對如何在myPHPAdmin中創建fk-pk關係以及他們實際做了什麼感到困惑。我認爲這些關係對於連接表格是必要的(顯然是錯誤的)。我看到了視覺連接,儘管這些表格以某種方式「連接」。

我知道,當你創建一個外鍵父鍵約束時,你基本上所做的只是限制他們可以根據另一個表中的內容輸入到表中的數據。您仍然可以在不受這些限制的情況下加入不同表格中的信息