Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL查询太多?_Php_Mysql - Fatal编程技术网

Php MySQL查询太多?

Php MySQL查询太多?,php,mysql,Php,Mysql,如果有人能回答我的问题。请原谅我在这方面缺乏经验,但这是我尝试的第一个项目,所有这些对我来说都是全新的。我正在尝试使用php和mySQL构建一个库存系统,关于如何显示当前借出给人们的物品,我遇到了一些困难 我将提供给用户的项目分为4类,这些项目的贷款记录存储在4个不同的表中。我还有另一个用于用户的表,以及用于项目及其特征的表 当我的页面显示时,我希望将分配给每个用户的所有项目分组到一个表中。关于如何做到这一点,我有两个想法,但我不确定哪一个是最好的方法 我的第一个想法是从users表中提取所有用

如果有人能回答我的问题。请原谅我在这方面缺乏经验,但这是我尝试的第一个项目,所有这些对我来说都是全新的。我正在尝试使用php和mySQL构建一个库存系统,关于如何显示当前借出给人们的物品,我遇到了一些困难

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

当我的页面显示时,我希望将分配给每个用户的所有项目分组到一个表中。关于如何做到这一点,我有两个想法,但我不确定哪一个是最好的方法

我的第一个想法是从users表中提取所有用户并将信息存储到一个数组中,然后从4个loan表中提取所有信息并将每个表存储到一个数组中。从那里我会做一些类似的事情

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个不同的项目。这将意味着大约40000-60000次循环迭代

我的另一个想法是从用户表中提取所有条目,然后在where语句中使用该数据查询其他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
    }
}
$sql=“从用户中选择用户ID”;
$alluser=runQuery($sql)//在运行查询之前,数据将被清理

对于($i=1;$i通过考虑一个额外的
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
(参考上面的答案。这太长了,无法作为评论添加,但我认为这会有所帮助)

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

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


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

肯定应该是一个查询。您问错了。您的第一个问题是问题应标记为[sql]和[mysql]只是,要求正确的数据库设计是的,你必须弄清楚你的数据库设计。然后你将使用连接将所有数据合并到一个查询中。结果将是数组,你可以使用数组创建一个表。
连接这4个表并用userid对其进行过滤谢谢你的回复,我想我理解你的意思使用一个查询和联接。我将更新我的问题以确认我有此权限。上面的示例代码可能过于简单化了。为什么需要4个不同的贷款表?如果有4种不同类型的贷款,则只需创建一个主表,其中包含一个字段,如:loan\u category。然后使用用户id搜索该表,结果按loa排序n_类。