2

我有一个问题,如果有人可以回答。请原谅我对此缺乏经验,但这是我尝试的第一个项目,所有这些对我来说都是全新的。我正在尝试使用 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 语句中使用用户 ID 查询其他 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 次调用。有人对我的最佳行动方案有任何意见吗?任何帮助将不胜感激。

4

2 回答 2

2

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

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

-- 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
于 2013-10-12T09:04:10.797 回答
0

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

@cartalot 和 @Uours 谢谢!!!!- 我早就考虑过为所有贷款创建一张表,但不知道如何实施。不过,这完全有道理。我的整个问题是混淆了 mySQL 中的外键 - 父键约束与如何实际连接表以在页面上显示信息。

听起来不像是个彻头彻尾的白痴,但我认为这对以后读到这篇文章的人来说可能是有建设性的。我对如何在 myPHPAdmin 中创建 fk - pk 关系以及它们的实际作用感到困惑。我认为这些关系是连接表所必需的(显然是错误的)。我看到了视觉上的联系,尽管这些表以某种方式“连接”起来。

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

于 2013-10-14T01:41:02.777 回答