MySQL查询太多了?

时间:2013-10-12 04:10:17

标签: php mysql

我有一个问题,如果有人可以回答。请原谅我对此缺乏经验,但这是我尝试的第一个项目,所有这些对我来说都是新手。我正在尝试使用php和mySQL在工作中构建库存系统,并且我对如何显示当前借给人们的项目打了一层墙。

我将分配给用户的项目分为4类,这些项目的贷款记录存储在4个不同的表中。我还有另一个用户表,以及项目表及其特征。

显示我的页面时我想要的是将分配给每个用户的所有项目组合在一起。关于如何做到这一点,我有两个想法,但我不确定哪种方式最好。

我的第一个想法是从users表中提取所有用户并将信息存储到一个数组中,然后从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次调用。有没有人对我最好的行动方案有任何意见?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

通过考虑额外的category列,您可以有一个loantable而不是四个。然后你只需要通过JOIN表格使用一个查询。

只是一个示例,显示了一种方法:

-- 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

答案 1 :(得分:0)

(请参阅上面的答案。这太长了,无法添加评论,但我认为这会有所帮助)

@cartalot和@Uours谢谢!!!! - 我曾考虑过尽早为所有贷款创建一个表,但不知道如何实现它。这虽然很有道理。我的整个问题是混淆外键 - 在mySQL中的父键约束,以及如何实际连接表以在页面上显示信息。

听起来不像是一个完整的白痴,但我认为这可能对那些在未来阅读此内容的人有建设性意义。我对如何在myPHPAdmin中创建fk-pk关系以及它们实际做什么感到困惑。我认为这些关系是加入表格所必需的(显然是错误的)。我看到了视觉连接,虽然这些表格以某种方式“连接”。

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