【问题标题】:SQL query to SELECT multiple columns from multiple tables for display用于从多个表中选择多个列进行显示的 SQL 查询
【发布时间】:2021-01-20 13:29:54
【问题描述】:

我有一个products 表和一个inventory_order_product 表。我需要从products 表中选择product_id、product_name、product_unit 和product_status,还需要从inventory_order_product 表中选择quantity。我还需要以这种格式输出它 - Product Name (Quantity ProductUnit) example LG LED TV (20 Cartons)

我试过了,它没有显示任何东西

function fill_product_list($connect)
{
    $query = "
    SELECT products.product_id, products.product_name, products.product_unit, products.product_status
    inventory_order_product.quantity
    FROM products INNER JOIN inventory_order_product
    ON products.product_id = inventory_order_product.product_id
    WHERE products.product_status = 'active' 
    ORDER BY products.product_name ASC
    ";
    $statement = $connect->prepare($query);
    $statement->execute();
    $result = $statement->fetchAll();
    $output = '';
    foreach($result as $row)
    {
        $output .= '<option value="'.$row["product_id"].'">'.$row["product_name"].' ('.$row["quantity"].' '.$row["product_unit"].')</option>';
    }
    return $output;
}

我需要选择active的所有产品,这就是我还需要选择product_status的原因

编辑:在我调整 SQL 语句之前,我包括了调用函数 fill_product_list 和原始函数的部分

这是我在插入数据时调用函数的地方 - 创建新订单

if(isset($_POST['btn_action']))
{
    if($_POST['btn_action'] == 'Add')
    {   
        $query = "
        INSERT INTO inventory_order (user_id, inventory_order_total, inventory_order_date, inventory_order_name, inventory_order_address, payment_status, inventory_order_status, inventory_order_created_date) 
        VALUES (:user_id, :inventory_order_total, :inventory_order_date, :inventory_order_name, :inventory_order_address, :payment_status, :inventory_order_status, :inventory_order_created_date)
        ";
        $statement = $connect->prepare($query);
        $statement->execute(
            array(
                ':user_id'                      =>  $_SESSION["userid"],
                ':inventory_order_total'        =>  0,
                ':inventory_order_date'         =>  $_POST['inventory_order_date'],
                ':inventory_order_name'         =>  $_POST['inventory_order_name'],
                ':inventory_order_address'      =>  $_POST['inventory_order_address'],
                ':payment_status'               =>  $_POST['payment_status'],
                ':inventory_order_status'       =>  'active',
                ':inventory_order_created_date' =>  date("Y-m-d")
            )
        );
        $result = $statement->fetchAll();
        $statement = $connect->query("SELECT LAST_INSERT_ID()");
        $inventory_order_id = $statement->fetchColumn();

        if(isset($inventory_order_id))
        {
            $total_amount = 0;
            for($count = 0; $count<count($_POST["product_id"]); $count++)
            {
                $product_details = fetch_product_details($_POST["product_id"][$count], $connect);
                $sub_query = "
                INSERT INTO inventory_order_product (inventory_order_id, product_id, quantity, price, tax) VALUES (:inventory_order_id, :product_id, :quantity, :price, :tax)
                ";
                $statement = $connect->prepare($sub_query);
                $statement->execute(
                    array(
                        ':inventory_order_id'   =>  $inventory_order_id,
                        ':product_id'           =>  $_POST["product_id"][$count],
                        ':quantity'             =>  $_POST["quantity"][$count],
                        ':price'                =>  $product_details['price'],
                        ':tax'                  =>  $product_details['tax']
                    )
                );
                $base_price = $product_details['price'] * $_POST["quantity"][$count];
                $tax = ($base_price/100)*$product_details['tax'];
                $total_amount = $total_amount + ($base_price + $tax);
            }
            $update_query = "
            UPDATE inventory_order 
            SET inventory_order_total = '".$total_amount."' 
            WHERE inventory_order_id = '".$inventory_order_id."'
            ";
            $statement = $connect->prepare($update_query);
            $statement->execute();
            $result = $statement->fetchAll();
            if(isset($result))
            {
                echo 'Order Created Successfully.';
                echo '<br />';
                echo "Total Price: $". $total_amount;
                echo '<br />';
                echo "Order Number: ".$inventory_order_id;
            }
        }
    }
}

此外,在我决定调整 SQL 语句以便它可以捕获 Product Name (Quantity ProductUnit) 之前,该函数运行良好。下面是我决定调整 SQL 语句之前的函数。

function fill_product_list($connect)
{
    $query = "
    SELECT * FROM products 
    WHERE product_status = 'active' 
    ORDER BY product_name ASC
    ";
    $statement = $connect->prepare($query);
    $statement->execute();
    $result = $statement->fetchAll();
    $output = '';
    foreach($result as $row)
    {
        $output .= '<option value="'.$row["product_id"].'">'.$row["product_name"].'</option>';  }
        
    return $output;
}

我们将不胜感激。

【问题讨论】:

  • 很抱歉有明显的问题。你调用了这个函数吗?如果是这样,怎么做?你只显示它的定义。请包含更完整的代码,以便我们查看上下文。您是否在 PHP 之外运行 SQL 以确保它确实返回数据?
  • 是的@Parfait 我调用了这个函数,所以我可以在创建新订单时列出所有active 产品。在我尝试调整它以捕获quantity 和product_unit 之前,该功能也可以完美运行。我已经包含了两个代码
  • 将INNER JOIN 添加到不返回任何结果的查询意味着在WHERE 条件下的两个表之间没有匹配项。 LEFT JOIN 是否返回结果?另外,我看不到第二个代码块在哪里调用fill_product_list。最后,有趣的是,您参数化了除最后一个 UPDATE 之外的所有查询。保持一致。为什么要在数值周围加上单引号?您可能正在使用允许这样做的 MySQL/MariaDB(请标记 BTW),但其他数据库会因类型不匹配而出错。

标签: php sql inner-join


【解决方案1】:

我通过选择所有记录来解决它。


function fill_product_list($connect)
{
    $query = "
    SELECT *
    FROM products INNER JOIN inventory_order_product
    ON products.product_id = inventory_order_product.product_id
    WHERE products.product_status = 'active' 
    ORDER BY products.product_name ASC
    ";
    $statement = $connect->prepare($query);
    $statement->execute();
    $result = $statement->fetchAll();
    $output = '';
    foreach($result as $row)
    {
        $output .= '<option value="'.$row["product_id"].'">'.$row["product_name"].' ('.$row["quantity"].' '.$row["product_unit"].')</option>';
    }
    return $output;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    相关资源
    最近更新 更多