gpt4 book ai didi

php - 减少 MySQL 查询数量并按正确顺序输出数据

转载 作者:行者123 更新时间:2023-11-29 14:53:30 26 4
gpt4 key购买 nike

我的主要问题是查询数据库的次数(见下文)。另外,我想在输出 select 语句之前检查当前产品 (optionsToProducts.productID) 是否具有当前 optionName 的选项!请参阅下面的最终图像以查看空白选择框...

我总共有 8 个表,但重要的 3 个是:

选项名称

http://www.grabb.co.uk/stack/001.png

产品选项

http://www.grabb.co.uk/stack/002.png

产品选项

http://www.grabb.co.uk/stack/003.png

<?php

$i=0;

$optionsquery = "SELECT * FROM optionNames WHERE categoryID = ".$categoryID."";
$optionsresult= mysql_query($optionsquery) or die(mysql_error());

while ($optionnames = mysql_fetch_array($optionsresult)) {

$i++;
$optionname = $optionnames["optionName"];
$optionID = $optionnames["optionNamesID"];
//echo $optionname."<br />";

?>
<label for="option<?php echo $i; ?>"><?php echo $optionname; ?></label>
<select name="option<?php echo $i; ?>" id="<?php echo $i; ?>">

<?php

//$optionvalues = "SELECT * FROM (optionsToProducts,productOptions) WHERE optionsToProducts.productID = ".$productID." AND productOptions.optionNamesID = ".$optionID."";
//echo $optionvalues."<br /><br />";
$optionvalues = "SELECT * FROM optionsToProducts WHERE productID = ".$productID."";
$valuesresult= mysql_query($optionvalues) or die(mysql_error());

while ($optionvals = mysql_fetch_array($valuesresult)) {

$valueName = $optionvals["optionValue"];
$valueID = $optionvals["productOptionsID"];
//echo $valueName."<br />";

$optionfinal = "SELECT * FROM productOptions WHERE productOptionsID = ".$valueID." AND optionNamesID = ".$optionID."";
$finalresult= mysql_query($optionfinal) or die(mysql_error());

while ($optionlast = mysql_fetch_array($finalresult)) {

$optionValueName = $optionlast["optionValue"];
$optionValueID = $optionlast["productOptionsID"];
$num_rows = mysql_num_rows($finalresult);
?>
<option value="<?php echo $optionValueID; ?>"><?php echo $optionValueName; ?></option>
<?php
}
}

echo "</select>";

}

?>

最终输出:

http://www.grabb.co.uk/stack/004.png

一如既往,我们非常感谢您的帮助。谢谢。

最佳答案

由于您使用 join 标记来标记此问题,因此您可能知道需要编写一个联接查询才能获得所需的内容。

<?php
$i=0;
$query = "SELECT options.optionName, options.optionNamesID, po.optionValue, po.productOptionsID
FROM optionNames AS options
INNER JOIN productOptions AS po ON po.optionNamesID=options.optionNamesID
INNER JOIN optionsToProducts AS otp ON otp.productOptionsID=po.productOptionsID
WHERE otp.productID=" . (int) $productID
. " AND options.categoryID=" . (int) $categoryID;
$result = mysql_query($query);
if($result) {
$rows = array();
while($row = mysql_fetch_assoc($result) ) {
$rows[] = $row;
}

$i = 0;
$optionId = null;
foreach($rows as $row) {
if($optionId != $row['optionNamesID']) {
$optionId = $row['optionNamesID'];
?>
<label for="option<?php echo $optionId; ?>"><?php echo $row['optionName']; ?></label>
<select name="option<?php echo $optionId; ?>" id="<?php echo $optionId; ?>">
<?php } ?>
<option value="<?php echo $row['productOptionsID']; ?>"><?php echo $row['optionValue']; ?></option>
<?php
//Close select element when the optionNamesID changes or on the last row
if( (isset($rows[$i + 1]) && $rows[$i + 1]['optionNamesID'] != $optionId) ||
!isset($rows[$i + 1]) ) { ?>
</select>
<?php }
$i++;
}
} else {
//Debug query, remove in production
echo mysql_error();
}
?>

我还做了一些小更改 - 我在选择和标签标签名称中使用了 optionNamesID - 我不知道您以前如何知道哪个选择属于哪个选项。我还假设categoryID和productID来自某个地方,因为它没有在代码中指定。

在开始时将所有行插入数组是可选的,但这使代码更有条理(因为您可以在数组中提前检查以查看在哪里关闭选择标记)。

注意 - 此代码未经测试,因此可能存在一些轻微的拼写错误。如有必要,请进行必要的更正。

关于php - 减少 MySQL 查询数量并按正确顺序输出数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5203884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com