【问题标题】:Reduce number of MySQL Queries and Output Data in Correct Order以正确的顺序减少 MySQL 查询和输出数据的数量
【发布时间】:2011-03-05 12:44:38
【问题描述】:

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

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

选项名称

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

产品选项

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

一如既往,感谢您的帮助。谢谢。

【问题讨论】:

    标签: php mysql forms select join


    【解决方案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 来自某个地方,因为它没有在代码中指定。

    在开头将所有行推入一个数组是可选的,但它使代码更有条理(因为您可以提前检查数组以查看关闭选择标签的位置)。

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

    【讨论】:

    • 谢谢伊兰。我真的很感激这一点。我有一个想法,我应该使用 JOIN,但不知道在哪里!我将测试代码并回复您。再次感谢
    • 第一次工作。惊人! :) 再次感谢 Eran
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-08-13
    • 2018-10-07
    • 1970-01-01
    • 2014-11-07
    相关资源
    最近更新 更多