[英]SQL Statement within nested while loops
我正在為我們的IT部門編寫一份股票盤點申請,但我不確定自己的發展方式是否最佳。
我創建了一個“產品組”表和一個“產品”表,這些表與一個ID(一個產品組到許多產品)產品組關聯,例如LaserJet Pro 400,產品將是單個消耗品。.黑色,品紅色,青色等。
因此,發生的事情是我有一個while循環來顯示組,然后有一個嵌套的while循環來顯示該組內的產品。
我擔心的是很多sql語句急速發展,在此早期階段似乎沒有性能問題,但我不確定..是否可以接受? 有沒有更好的辦法?
foreach ($_POST['BeginLocation'] as $key => $value) {$LocationID = $key;}
echo '<div class="nmform"><form name="StockTake" action="index.php" method="post" enctype="multipart/form-data">';
include "../DBCon/RDPNearMisses.php";
$GetProductGroups = sqlsrv_query($NMDB, "select distinct PD.ProductGroupID, PG.GroupName
from [JobObservations].[dbo].[ITStk.Products] as PD
inner join [JobObservations].[dbo].[ITStk.ProductGroups] as PG on PD.ProductGroupID = PG.ProductGroupID
where PD.LocationID = $LocationID");
if( $GetProductGroups === false ) {
if( ($errors = sqlsrv_errors() ) != null) {
foreach( $errors as $error ) {
echo "SQLSTATE: ".$error[ 'SQLSTATE']."<br />";
echo "code: ".$error[ 'code']."<br />";
echo "message: ".$error[ 'message']."<br />";
}
}
}
while ($row = sqlsrv_fetch_array($GetProductGroups)) {echo '<h4>'.$row['GroupName'].'</h4>';
$ProductGroupID = $row['ProductGroupID'];
$GetProducts = sqlsrv_query($NMDB, "select PD.ProductID, PD.ProductGroupID, PD.ProductCode, PD.ProductDescription
from [JobObservations].[dbo].[ITStk.Products] as PD
inner join [JobObservations].[dbo].[ITStk.ProductGroups] as PG on PD.ProductGroupID = PG.ProductGroupID
inner join [JobObservations].[dbo].[ITStk.Locations] as LC on PD.LocationID = LC.LocationID
where PD.LocationID = $LocationID
and PD.ProductGroupID = $ProductGroupID
order by LC.LocationDescription asc, PG.GroupName asc, PD.ProductCode asc");
if( $GetProducts === false ) {
if( ($errors = sqlsrv_errors() ) != null) {
foreach( $errors as $error ) {
echo "SQLSTATE: ".$error[ 'SQLSTATE']."<br />";
echo "code: ".$error[ 'code']."<br />";
echo "message: ".$error[ 'message']."<br />";
}
}
}
echo '<table><th>Code</th><th>Description</th><th>Qty</th>';
while ($row1= sqlsrv_fetch_array($GetProducts)) {echo '<tr><td>'.$row1['ProductCode'].'</td><td>'.$row1['ProductDescription'].'</td><td><select name="'.$row1['ProductID'].'"><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option></select></td></tr>';}
echo '</table>';
}
echo '<input type="Submit" name="SubmitStock"></form>';
sqlsrv_close($NMDB);
echo '</div>';
雖然數據很小,每個位置的組數很小,但是您可能不會注意到差異,但是隨着每個位置的組數變化,您可能需要考慮切換到1個查詢和while循環:
SELECT DISTINCT
PD.ProductID,
PG.GroupName,
PD.ProductGroupID,
PD.ProductCode,
PD.ProductDescription
FROM [JobObservations].[dbo].[ITStk.Products] AS PD
INNER JOIN [JobObservations].[dbo].[ITStk.ProductGroups] AS PG ON PD.ProductGroupID = PG.ProductGroupID
INNER JOIN [JobObservations].[dbo].[ITStk.Locations] AS LC ON PD.LocationID = LC.LocationID
WHERE PD.LocationID = $LOCATIONID;
它將很好地工作,因為它將為您提供一個記錄集,其中包含未使用的GroupName以及您在表中使用的產品ID和產品描述。
此外,除非將表ITStk.Locations
僅僅是為了限制Locations
表中實際存在LocationID
記錄,否則就不需要在此處聯接它。 您不使用任何字段來限制結果集或SELECT。
幾乎每當您發現自己抓住一個記錄集並在讀取/循環記錄集時發出更多的SQL時,您都可以將其變成一條SQL語句。
為了讓您的GroupName
作為表頭,在您的while循環中,您可以執行以下操作(請原諒,自從我寫PHP已有幾年了):
$GetProductGroups = sqlsrv_query($NMDB, "SELECT DISTINCT
PD.ProductID,
PG.GroupName,
PD.ProductGroupID,
PD.ProductCode,
PD.ProductDescription
FROM [JobObservations].[dbo].[ITStk.Products] AS PD
INNER JOIN [JobObservations].[dbo].[ITStk.ProductGroups] AS PG ON PD.ProductGroupID = PG.ProductGroupID
INNER JOIN [JobObservations].[dbo].[ITStk.Locations] AS LC ON PD.LocationID = LC.LocationID
WHERE PD.LocationID = $LOCATIONID
ORDER BY GroupName;");
if( $GetProductGroups === false ) {
if( ($errors = sqlsrv_errors() ) != null) {
foreach( $errors as $error ) {
echo "SQLSTATE: ".$error[ 'SQLSTATE']."<br />";
echo "code: ".$error[ 'code']."<br />";
echo "message: ".$error[ 'message']."<br />";
}
}
}
while ($row = sqlsrv_fetch_array($GetProductGroups)) {
/*If the groupname of the current record is different then the last record's group name (notice order by on query) then echo out the header and start a new table*/
if ( $groupname != $row['GroupName']) {
echo '<h4>'.$row['GroupName'].'</h4>';
echo '<table><th>Code</th><th>Description</th><th>Qty</th>';
}
/*echo out the row into the table*/
echo '<tr><td>'.$row['ProductCode'].'</td><td>'.$row['ProductDescription'].'</td><td><select name="'.$row1['ProductID'].'"><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option><option>0</option></select></td></tr>';
/*again if we started a new table because the groupname is new in the recordset, then close the table*/
if ( $groupname != $row['GroupName']) {
echo '</table>';
}
/*Capture group name for future iterations*/
$groupname = $row['GroupName'];
}
echo '<input type="Submit" name="SubmitStock"></form>';
sqlsrv_close($NMDB);
echo '</div>';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.