添加价格和库存后如何在不复制产品的情况下获取数据

Posted

技术标签:

【中文标题】添加价格和库存后如何在不复制产品的情况下获取数据【英文标题】:How to fetch data without duplicating products after adding price and stocks 【发布时间】:2018-04-28 09:39:01 【问题描述】:

我在添加价格、尺寸和库存时遇到问题。如何在不重复的情况下添加价格、库存和尺寸?

这是我的数据库结构:

tbl产品

tblextension

PS:tblproduct product_id 和 tblproduct_extension product_id 是一样的。


这是我添加价格、库存和价格后的结果。如您所见,有两个“Nike Lebron 15 Ghost”。

查询

SELECT * FROM tblproduct LEFT JOIN tblproduct_extension ON tblproduct_extension.product_id = tblproduct.product_id;

ajax

//Show modal for adding size, price and stocks
function add_product_extension() 
    $('#product_add_extension').click(function(e)
        var product_id = $('#product_id').val();
        var product_price = $('#product_price').val();
        var product_stocks = $('#product_stocks').val();
        var product_size = $('#product_size').val();
        $.ajax(
            type: 'POST',
            url: '../admin/class.php',
            data: product_id:product_id,product_price:product_price,product_stocks:product_stocks,product_size:product_size,
            success:function(data) 
                $('#addSize').modal('hide');
            
        );
    );

class.php

    //Add size, price, stocks
    if(isset($_POST['product_id'])) 
        $product_price = $_POST['product_price'];
        $product_stocks = $_POST['product_stocks'];
        $product_size = $_POST['product_size'];
        $product_id = $_POST['product_id'];

        $insert_query = "INSERT INTO tblproduct_extension (product_stocks, product_price, product_size, product_id)VALUES('$product_stocks', '$product_price', '$product_size', '$product_id')";
        $query = mysqli_query($db_conn, $insert_query);
    

商品展示代码

    //Get Products by ID
    function get_products() 
        GLOBAL $db_conn;
        $id = $_GET['id'];
        $search_query= "SELECT * FROM tblproduct LEFT JOIN tblproduct_extension ON tblproduct_extension.product_id = tblproduct.product_id WHERE tblproduct.segment_id='$id'";
        $query = mysqli_query($db_conn, $search_query);

        while ($row = mysqli_fetch_array($query)) 
            ?>
                <div class="products">
                    <a href="details.php?view_product=<?=$row['product_id']?>&id=<?=$row['segment_id']?>"><img class="img_product" src="../admin/<?=$row['product_image']?>" ></a>
                    <?php if($row['product_stocks'] == 0) ?>
                        <span class="stock-label">SOLD OUT</span>
                    <?php  ?>
                    <h4><?=$row['product_name']?></h4>
                    <h3>&#8369;<?=number_format($row['product_price'], 2)?></h3>
                </div>
            <?php
        
        return $row;
    

【问题讨论】:

查看重复键 SELECT * FROM tblproduct LEFT JOIN tblproduct_extension ON DUPLICATE KEY UPDATE tblproduct_extension.product_id = tblproduct.product_id;检查我的查询。 你不能在一个选择中更新 怎么样?我该怎么办? 这是两个不同的问题。对于您的最后一条评论:唯一 ID 并不是真的要更新,如果您这样做,当然您需要更改提及此 ID 的其他表中对该 ID 的每个引用。我们所说的是,当您向tblproduct_extension 添加一行时,您应该在之前检查当前的product_id 是否还没有一个,因为如果您插入第二个,您将有两组相互冲突的值你的股票,价格等。实际上tblproduct_extension中的product_id应该设置为UNIQUE 【参考方案1】:

因为你可以有多个product_size,你也可以用产品名称显示这个信息

...
<h4><?=$row['product_name']?> - Size <?=$row['product_size']?></h4>
...

你可以做一些更复杂的查询来实现你想要的(函数 get_products)。

首先选择唯一的一对产品/扩展,扩展键最小。从这里,您可以再次选择要显示的数据。

这些查询没有经过测试,但提供了一个想法。

使用 GROUP BY

-- 2. After you select your data with unique id get from sub query
SELECT      p.*, pe.*
FROM        tblproduct p
JOIN        (
            -- 1. First select your product_id and smallest product_extension_id
            SELECT      p.product_id, 
                        MIN(pe.product_extension_id) as product_extension_id
            FROM        tblproduct p
            LEFT JOIN   tblproduct_extension pe
            ON          pe.product_id = p.product_id 
            WHERE       p.segment_id='$id'
            GROUP BY    p.product_id
) product_unique
JOIN        tblproduct_extension pe
ON          pe.product_extension_id = product_unique.product_extension_id
WHERE       p.product_id = product_unique.product_id            

使用 DISTINCT

-- 2. After you select your data with unique id get from sub query
SELECT      p.*, pe.*
FROM        tblproduct p
JOIN        (
            -- 1. First select your product_id and smallest product_extension_id
            SELECT      DISTINCT
                        p.product_id, 
                        MIN(pe.product_extension_id) as product_extension_id
            FROM        tblproduct p
            LEFT JOIN   tblproduct_extension pe
            ON          pe.product_id = p.product_id 
            WHERE       p.segment_id='$id'
) product_unique
JOIN        tblproduct_extension pe
ON          pe.product_extension_id = product_unique.product_extension_id
WHERE       p.product_id = product_unique.product_id            

【讨论】:

谢谢。但我只想展示一个 Lebron 15 Ghost。 @Yeezus,我添加了另一种方法来解决您的问题,也许这会有所帮助。它的基本答案here 错误:在没有 GROUP BY 的聚合查询中,SELECT 列表的表达式 #1 包含非聚合列 'dbshopping.p.product_id';这与 sql_mode=only_full_group_by 不兼容 @Yesszus 完美!很高兴知道你让它起作用了! :-) 我在第一个查询中添加了GROUP BY。这是您为使此查询正常工作所做的吗?【参考方案2】:
$search_query= "SELECT DISTINCT * FROM tblproduct LEFT JOIN tblproduct_extension ON tblproduct_extension.product_id = tblproduct.product_id WHERE tblproduct.segment_id='$id'";

SELECT DISTINCT 语句用于仅返回不同(不同)的值。

如果您不想重复,可以从查询中删除它们。

【讨论】:

Distinct * 是矛盾的

以上是关于添加价格和库存后如何在不复制产品的情况下获取数据的主要内容,如果未能解决你的问题,请参考以下文章

在不添加新记录的情况下获取下一个主键是不可能的,不是吗? [复制]

产品更新后的 Woocommerce 获取库存

Vue组件收到数据后如何更新

如何在不复制目标 NSManagedObject 的情况下将目标 NSManagedObject 添加到另一个具有反向多对多核心数据关系的对象?

如何在同一资源LARAVEL中返回数据透视表的数据

如何在 WooCommerce 中为自定义产品类型启用价格和库存