2013-10-12 92 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关系以及他们实际做了什么感到困惑。我认为这些关系对于连接表格是必要的(显然是错误的)。我看到了视觉连接,尽管这些表格以某种方式“连接”。

我知道,当你创建一个外键父键约束时,你基本上所做的只是限制他们可以根据另一个表中的内容输入到表中的数据。您仍然可以在不受这些限制的情况下加入不同表格中的信息