2011-03-05 65 views
0

我的主要问题是查询数据库的次数(见下文)。另外,我想在输出select语句之前检查当前产品(optionsToProducts.productID)是否具有当前optionName的选项!看到最终的图像下方看到空白的选择框...以正确的顺序减少MySQL查询和输出数据的数量

我总共有8桌,但重要的3:

optionNames

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

productOptions

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

optionsToProducts

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

与往常一样,你的帮助表示赞赏。谢谢。

回答

1

由于您使用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来自某处,因为它没有在代码中指定。

推动所有行开头的数组是可选的,但它使代码略偏组织(因为你可以提前检查数组中看到关闭选择标签)。

注意 - 此代码是未经测试,从而有可能一些小的拼写错误。如有必要,请进行必要的更正。

+0

谢谢伊兰。我很欣赏这一点。我有一个想法,我应该使用JOIN,但不知道在哪里!我将测试代码并回复给您。再次感谢 – drandom 2011-03-05 13:46:08

+0

仅供参考 - 我在代码 – 2011-03-05 13:47:16

+0

曾为第一次修正一个小错字。惊人! :) 再次感谢伊兰 – drandom 2011-03-05 14:08:35