【问题标题】:Double while loop with sql query带有sql查询的双while循环
【发布时间】:2017-09-01 21:01:15
【问题描述】:

我创建了一个运行良好的代码,但我不确定它是否“合法”。 我在来自另一个 sql 查询的 while 循环中使用 sql 查询,这意味着(第二个)sql 查询重复第一个查询返回的行数。

谁能告诉我我是否可以使用这个或它只是一团糟?

代码:

$conn = mysqli_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql_feat = 'SELECT * FROM wp_wpl_dbst WHERE category = 105';
$result_feat = mysqli_query($conn, $sql_feat);

if (mysqli_num_rows($result_feat) > 0) {

    while($row = mysqli_fetch_assoc($result_feat)) {

        $filter_feat = $row["table_column"];
        $filter_name = $row["name"];

        $sql_feat2 = 'SELECT * FROM wp_wpl_properties';
        $result_feat2 = mysqli_query($conn, $sql_feat2);

        if (mysqli_num_rows($result_feat2) > 0) {

            while($row2 = mysqli_fetch_assoc($result_feat2)) {

                if (!empty($row2[$filter_feat])) {
                    echo $filter_name;
                    echo "<br>";                                         
                } 
            }
        }                                                          
    }
}

mysqli_close($conn); 

【问题讨论】:

  • 我不明白你为什么多次执行内部sql查询。它不会改变,因此您可以保证每次都获得相同的结果,因为两者之间不会进行更新或插入。这意味着在循环之外执行一次查询并获取结果集就足够了。
  • 这两个查询之间有什么关联?也许离开加入table_column..
  • @chris85 第一个查询检查第二个while循环必须使用哪个表列
  • @ThomasBeumer 你能从每个表中发布一些示例行吗?我不确定我是否了解它是如何工作的。
  • @arkascha 有道理,我尝试过之后会回复你。感谢您的输入。还在学习o.o"..

标签: php mysql sql while-loop


【解决方案1】:

首先,在假设它代表正确的查询结果之前,您应该始终检查 mysqli_query 的结果:

// you should check if this value is FALSE before using it
$result_feat = mysqli_query($conn, $sql_feat);

// and this too
$result_feat2 = mysqli_query($conn, $sql_feat2);

对于在循环内运行查询的代码,除非没有其他选择,否则几乎总是不鼓励这样做。在循环内运行任何查询之前,您应该探索 JOIN 的可能性。可能存在您别无选择的情况,但在您的代码中,我根本看不到反复运行此查询的任何意义:

$sql_feat2 = 'SELECT * FROM wp_wpl_properties';

如果它引用了 $row 中的值,那么可能。但它没有。

【讨论】:

  • 是的,但JOIN 总是更可取的方法,即使 if 两个查询以某种方式连接。问题是性能。尽管这样的JOINs 正是关系数据库系统的强项,这也正是查询变得_really_slow 的地方。有时使用单独的查询更有效。
【解决方案2】:

本质上,您正在执行动态 sql,因此无法进行联接,但将 where 子句添加到第二次选择会使其更有效。类似于 - $sql_feat2 = 'SELECT ' + $filter_name + ' FROM wp_wpl_properties where ' + $row2[$filter_feat] + ' is not null';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-12
    • 2015-07-16
    • 2015-02-08
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 2013-10-27
    相关资源
    最近更新 更多