Php Mysql查询性能或逻辑改进

Php Mysql查询性能或逻辑改进,php,mysql,performance,Php,Mysql,Performance,这里完全没有想法,可能需要一个我看不到的简单解决方案。。我需要一个更好的逻辑为我所做的事情或一些性能提示。谢谢你,对不起我的英语 好的,下面是我要做的: 我有一些订单(表comenzi),每个订单有一个或多个产品(表croit),其中一些产品有库存(表magazie) 我想显示如下列表: 订单1有产品1,但产品1也可以在其他订单上找到, 因此,对于每个订单,我都会搜索它拥有的产品, 对于该订单中的每个产品,我在所有其他订单中搜索,看看是否找到了它, 如果我找到它,我会搜索库存以显示我们有多少这些

这里完全没有想法,可能需要一个我看不到的简单解决方案。。我需要一个更好的逻辑为我所做的事情或一些性能提示。谢谢你,对不起我的英语

好的,下面是我要做的: 我有一些订单(表comenzi),每个订单有一个或多个产品(表croit),其中一些产品有库存(表magazie)

我想显示如下列表: 订单1有产品1,但产品1也可以在其他订单上找到, 因此,对于每个订单,我都会搜索它拥有的产品, 对于该订单中的每个产品,我在所有其他订单中搜索,看看是否找到了它, 如果我找到它,我会搜索库存以显示我们有多少这些产品或类似的产品在库存中,然后我需要排除该产品,因此当我到达包含该特定产品的订单时,它将不会再次显示在他的订单中。 下面是一个简单的例子:

O1 (Order 1 from table comenzi) has P1,P2,P3 (products for Order 1 in table croit ),
O2 has P2,P5,P7
O3 has P1,P2,P7


The output should be:
O1 (Order 1 name and details)
    +P1 ( O1 - some details including stock)
    -P1 ( O3 - some details including stock)
    +P2 ( O1 - some details including stock)
    -P2 ( O2 - some details including stock)
    -P2 ( O3 - some details including stock)
    +P3 ( O1 - some details including stock)
O2 (Order 2 name and details)
    +P5 ( O2 - some details including stock)
    +P7 ( O2 - some details including stock)
    -P7 ( O3 - some details including stock)
O3 (Order 3 name and details)
    - no products because they were already displayed before
正如您所看到的,+符号表示产品来自该订单,并且首先进入,然后是其他订单的产品。。 这是我想要的基本输出。 如果您需要更多信息,请询问

我曾在以下方面做过尝试:

以下是索引,出于某种原因,fiddle在我使用它们时给了我一个错误

--
-- Indexes for table `comenzi`
--
ALTER TABLE `comenzi`
ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `id` (`id`);

--
-- Indexes for table `croit`
--
ALTER TABLE `croit`
ADD PRIMARY KEY (`id`);

--
-- Indexes for table `croitconf`
--
ALTER TABLE `croitconf`
ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `codprod` (`codprod`);

--
-- Indexes for table `magazie`
--
ALTER TABLE `magazie`
ADD PRIMARY KEY (`id`);

--
-- Indexes for table `magazine`
--
ALTER TABLE `magazine`
ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `comenzi`
--
ALTER TABLE `comenzi`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=10313;
--
-- AUTO_INCREMENT for table `croit`
--
ALTER TABLE `croit`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=87501;
--
-- AUTO_INCREMENT for table `croitconf`
--
ALTER TABLE `croitconf`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=2106;
--
-- AUTO_INCREMENT for table `magazie`
--
ALTER TABLE `magazie`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=2794;
--
-- AUTO_INCREMENT for table `magazine`
--
ALTER TABLE `magazine`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=83;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
为了简单起见,我将在这里只添加sql查询和一些关于它们应该如何工作的信息:

查询1:加载订单列表并将id保留为数组,同时我将数组保留在$u会话中以进行分页

$query = "SELECT numar_comanda FROM comenzi where factura ='' and valoare = '' and dataplecare!='NULL' and factcorectie = '' and terminat = 0";
而php:

while ($rowcom=mysqli_fetch_array($sqlcom)) {
    $combun[$rowcom['numar_comanda']]=$rowcom['numar_comanda'];
}
$_SESSION[combun]=$combun;
查询2:基本上是相同的查询,带有额外的字段,但这次对于每个订单,我开始提取要在订单下显示的产品

$query = "SELECT comenzi.numar_comanda, comenzi.dataplecare as dataplecare, comenzi.data_emitere as dataemitere, magazine.nume as magazin FROM comenzi,magazine
where comenzi.magazine_id=magazine.id and comenzi.factura ='' and comenzi.valoare = '' and comenzi.dataplecare!='NULL' and comenzi.factcorectie = ''  and comenzi.terminat = 0
order by comenzi.dataplecare ASC "; 
//我有$postnumbers OFFSET$OFFSET的限制,但不是必需的,如果我能设法使其快速加载,我可以删除分页

还有php

while ($row=mysqli_fetch_assoc($sqlq)) {
//echo a row with order details
if ($_SESSION[prod] != "") $donecodfurn="and codfurn not in(" . implode(",", array_filter($_SESSION[prod])) . ")"; //add explude rule to the next query so that the products that i already used will be dropped
在这段代码中,我有下一个查询来加载当前订单中的所有产品并循环它们:

$query = "SELECT croitconf.codprod as codprod,croitconf.codfurn as codfurn,croitconf.denumire as denumire,
croit.id as croitid,croit.croitconf_id as croitconfid,croit.cantitate as cantitate,croit.stare as stare
FROM croit,croitconf where croit.croitconf_id = croitconf.id and croit.stare <= 3 and croit.comenzi_id=$row[numar_comanda] $donecodfurn order by codfurn asc";
在这个循环中,我从magazie表中获得信息,这是一个库存表,如果我们有确切的库存产品(相同的codprod)或类似的产品(相同的codfurn),这有两个选项

如果我们有类似的产品在库存中,我们会做些什么

$magq = mysqli_query($sql,$query);
$mag=mysqli_fetch_array($magq);
//echo some data about stock if $mag is array


$query = "select sum(cantitate) as cant from magazie where codprod  = '" . $com[codprod] . "'";
$magq=mysqli_query($sql, $query);
$mag=mysqli_fetch_array($magq);
//echo some data about stock similar if $mag is array
php,如果我们有相同的产品在库存中的话

$magq = mysqli_query($sql,$query);
$mag=mysqli_fetch_array($magq);
//echo some data about stock if $mag is array


$query = "select sum(cantitate) as cant from magazie where codprod  = '" . $com[codprod] . "'";
$magq=mysqli_query($sql, $query);
$mag=mysqli_fetch_array($magq);
//echo some data about stock similar if $mag is array
进一步,我查看我的数组,看看是否还有未处理的订单可以获得与当前相同的产品

if (count($_SESSION[combun]) > 0) {

$donecom="and croit.comenzi_id IN(" . implode(",", array_filter($_SESSION[combun])) . ")"; // create a rule to search only in remaining orders

$query = "select croitconf.codprod as codprod,croitconf.codfurn as codfurn,croitconf.denumire as denumire,
croit.id as croitid,croit.comenzi_id as numar_comanda,croit.croitconf_id as croitconfid,croit.cantitate as cantitate,croit.stare as stare
FROM croit,croitconf where croit.croitconf_id = croitconf.id and croit.stare <= 2 and croitconf.codfurn=$com[codfurn] $donecom and croit.comenzi_id != '$row[numar_comanda]' order by croitconf.codprod asc";

请提供您试图执行的操作的解释,而不是您想要执行的代码。为了统一起见,我将使所有查询字符串变为变量,并执行
$var=mysqli\u query($con,$query)
。显然,将这些更改为您的变量。这只是为了让你的代码有条理。至于性能,我觉得奇怪的是,这些需要很长时间才能执行。你在运行什么?你在循环中进行嵌套选择。几乎在所有情况下,这都是非常低效的,可以/应该重新编写一个
JOIN
ed查询。e、 如果您的外部表有一百万条记录,那么您的内部查询将被构建/解析/执行一百万次。而对于连接结构,您只需构建/解析/执行一次查询。我同意@MarcB的观点,您应该使用连接而不是所有这些。如果您需要有关良好查询的帮助,请在SQL FIDLE上构建一个模型。如果没有这一点,潜在的回答者将有太多的工作要做,以清楚地看到您正在使用的模式。至少从PHP中提取您正在运行的查询,这样我们就可以在不解析PHP代码的情况下正确地查看您在数据库端的操作。
$produse= mysqli_query($sql, $query);
while ($prod=mysqli_fetch_assoc($produse)) { //similar products as the one from the initial order
//echo something about the curent product, order number and some other infos

//i look again in our stock to see if we have this or a similar product, so basicaly the same code when we first look

    $query =  "select sum(cantitate) as cant from magazie where codfurn = '" . $com[codfurn] . "'";
    //if we find similar echo something
    $query = "select sum(cantitate) as cant from magazie where codprod  = '" . $com[codprod] . "'";
    //if we find same echo something    
} // end similat products
$_SESSION[prod][$com[codfurn]]=$com[codfurn]; // add product in array so we don't process it again
} 
} //end curent product from curent order
unset($_SESSION['combun'][$row['numar_comanda']]); //remove order from array so we won't search for products in it

} //end curent order