【问题标题】:PHP MySQL optimal way to perform multiple dependent queriesPHP MySQL 执行多个依赖查询的最佳方式
【发布时间】:2018-05-19 16:37:30
【问题描述】:

我需要查询(读取)一些数据,并在对不同的表执行另一个查询(读取)之前对其进行分析。

我查看了mysqli multiple statements,但他们没有关于第二个查询取决于第一个查询结果的情况的文档。

看来我当前执行两个查询的代码可能不是最佳的。有没有更优化的方法来做到这一点?

//FIRST QUERY
$query1= "SELECT color FROM products WHERE type = '$productType';";
$result = $conn->query($query1);

if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        $colorProduct = $row["color"];
    }
} 


//ANALYZE SEARCH RESULT FROM FIRST QUERY
if ($colorProduct == "green") {
    $colorType = "greenColorType";
}   
//a lot more analysis


//SECOND QUERY
$query2 = "SELECT price FROM Vendors WHERE color = '$colorType';";
$result2 = $conn->query($query2);

if ($result2->num_rows > 0) {
    while($row = $result2->fetch_assoc()) {
        $priceOfProduct = priceOfProduct . $row["price"];
    }
} 

$conn->close();

提前谢谢你。

【问题讨论】:

  • 我很想为此创建一个存储过程 - 特别是如果处理是一项常规任务。最后一个查询是使用. ~ 大概这是为了添加所以你可能想要+ 代替?
  • 看起来你可以用一个查询来做到这一点
  • 我同意这可以通过单个查询来完成。我想这让我感到困惑的是$colorType 仅在$colorProduct == "green" 时设置。你确定这是你想要的吗?也许明确说明您要实现的目标,因为您的代码在当前状态下难以解释。

标签: php mysql performance mysqli


【解决方案1】:

在进行第二次查询之前,您在供应商表中的颜色值似乎都在实际颜色名称之后添加了 ColorType,这是您在 PHP 中处理的。

Mysql 可以为你做到这一点。这是一个例子:

"SELECT a.color, b.price FROM products a, vendors b WHERE a.type = '$productType' AND a.color = SUBSTR(b.color,1,LENGTH(a.color);"

WHERE 子句指定$productType 变量与表 a(产品)的类型列匹配,以及表 a 中的颜色值与表 b 中颜色值的开头之间的匹配。它使用LENGTH 语句来匹配而不考虑表a 中颜色的长度。因此,如果表 a 中的颜色为 darkblue 并且表 b 为 darkblueColorType 它将匹配,如果值是 redredColorType 它将仍然匹配。

【讨论】:

    【解决方案2】:

    首先,您必须在“where”子句中添加一个“and”:SELECT color FROM products WHERE type = '$productType' and color = 'green'

    然后你必须在 SQL 中加入或添加子查询。

    事实上,你应该只做一个 SQL 请求。

    【讨论】:

      【解决方案3】:

      您为什么不将这 2 个查询合并为一个,然后在需要时进行分析。例如:

      "SELECT price FROM products
      JOIN Vendors ON Vendors.color = products.color
      WHERE type = $productType
      AND color = 'green';"
      

      MySQL 是声明性语言,因此通常最好“告诉它”您想要什么,然后再修改数据(如果需要)。

      【讨论】:

        猜你喜欢
        • 2016-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-30
        相关资源
        最近更新 更多