【问题标题】:Merge/Remove duplicate MySQL query results合并/删除重复的 MySQL 查询结果
【发布时间】:2011-12-09 08:00:58
【问题描述】:

您好,我正在运行一个从多个表中检索结果的查询。

我的查询从一个名为“store_orders_items”的表中检索订单,并从另一个名为“store_orders”的表中检索相应的客户详细信息。

但是,如果一个客户有两个订单,则查询会检索客户详细信息两次,因为查询会根据客户 ID 号选择订单。

所以我得到了两个订单的详细信息,这很好,但客户的详细信息也得到了两次,这是我不想要的。

如何调整我的查询以检索所有订单并且仅检索每个订单的客户详细信息?

这是目前的查询:

"SELECT   
                                store_orders.order_name, 
                                store_orders.order_address, 
                                store_orders.id, 
                                store_orders.order_town, 
                                store_orders.order_county, 
                                store_orders.order_postcode, 
                                store_orders.order_country, 
                                store_orders.order_email, 
                                store_orders.item_total,                                    
                                product.name, 
                                store_orders_items.sel_item_size, 
                                store_orders_items.sel_item_color,
                                store_orders_items.sel_item_id, 
                                store_orders.order_date, 
                                product.price 
                        FROM 
                                store_orders_items 
                        LEFT JOIN 
                                store_orders 
                        ON 
                                store_orders_items.order_id = store_orders.id 
                        LEFT JOIN 
                                product 
                        ON 
                                store_orders_items.sel_item_id = product.id 
                        WHERE 
                                store_orders_items.order_id=$id "

这是我用来输出/回显代码的基本示例:

while ($order = mysql_fetch_array($store_orders)){
                $name = $order["name"] ;
                $size = $order["sel_item_size"];
                $color = $order["sel_item_color"];
                $order_name = $order["order_name"];
                $address = $order["order_address"] ;
                $town = $order["order_town"] ;
                $county = $order["order_county"] ;
                $postcode = $order["order_postcode"] ;
                $country = $order["order_country"] ;
                $email = $order["order_email"] ;
                $price = $order["price"];
                $date = $order["order_date"];

                $item = "<li>{$name}</li>" ;
                $item .= "<li>{$color}</li>" ;
                $item .= "<li>{$size}</li>" ;
                $item .= "<li>{$price}</li>" ;
                $item .= "<li>{$date}</li>" ;
                $item .= "<li>{$order_name}</li>" ;
                $item .= "<li>{$address}</li>" ;
                $item .= "<li>{$town}</li>" ;
                $item .= "<li>{$county}</li>" ;
                $item .= "<li>{$postcode}</li>" ;
                $item .= "<li>{$country}</li>" ;
                $item .= "<li>{$email}</li>" ;

                echo $item ;
            }

【问题讨论】:

  • 为什么只需要一次客户详细信息?只需从第一行读取它们,在随后的行中忽略它们。

标签: php mysql


【解决方案1】:

你应该像这样使用 group by:group by customer_id

【讨论】:

    【解决方案2】:

    你想做的事是不可能的。 SQL JOIN 操作根据某些条件(在您的情况下为 order_id)将两个表的行连接在一起。结果行将包含您在 SELECT 语句的第一部分中指定的属性的数据。

    真正的问题是两次检索此数据存在什么问题。您没有必须使用您检索到的所有数据。如果您已经处理了客户的数据,则可以忽略它。

    我不推荐的另一种选择是使用一个查询检索所有客户数据,然后使用其他查询检索订单商品。

    编辑: 根据您提供的代码示例,此代码应该可以工作:

    // Output order details
    $order = mysql_fetch_array($store_orders);
    
    $order_name = $order["order_name"];
    $address = $order["order_address"] ;
    $town = $order["order_town"] ;
    $county = $order["order_county"] ;
    $postcode = $order["order_postcode"] ;
    $country = $order["order_country"] ;
    $email = $order["order_email"] ;
    $price = $order["price"];
    $date = $order["order_date"];
    
    $orderList = "<ul>";
    $orderList .= "<li>{$price}</li>" ;
    $orderList .= "<li>{$date}</li>" ;
    $orderList .= "<li>{$order_name}</li>" ;
    $orderList .= "<li>{$address}</li>" ;
    $orderList .= "<li>{$town}</li>" ;
    $orderList .= "<li>{$county}</li>" ;
    $orderList .= "<li>{$postcode}</li>" ;
    $orderList .= "<li>{$country}</li>" ;
    $orderList .= "<li>{$email}</li>" ;
    $orderList .= "</ul>";
    
    echo $orderList;
    
    // Reset result pointer
    mysql_data_seek($store_orders, 0);
    
    // Output Items
    echo "<ul>";
    while ($order = mysql_fetch_array($store_orders)){
        $name = $order["name"] ;
        $size = $order["sel_item_size"];
        $color = $order["sel_item_color"];
    
        $item = "<li>{$name}</li>" ;
        $item .= "<li>{$color}</li>" ;
        $item .= "<li>{$size}</li>" ;
    
    
        echo $item ;
    }
    echo "</ul>";
    

    此代码的第一部分检索 mysql 结果集的第一行。从这一行开始,客户数据显示在一个 html 无序列表中。然后代码通过调用 mysql_data_seek() 函数重置 mysql 结果集。然后它遍历结果集中的所有行,并在另一个 html 无序列表中输出所有项目。 您可能应该考虑另一种显示结果的方式,但这种改变是微不足道的。

    此外,此代码假定 $store_orders 变量中至少有一行。如果情况并非总是如此,您应该在执行此代码之前使用 mysql_num_rows() 函数进行检查。

    【讨论】:

    • 您好,谢谢您的回复。看来你的建议现在可行。内存使用是您不推荐此解决方案的原因吗?我现在很难想出一个替代方案!您还打算如何实现这一目标?
    • 如果您有很多客户,您必须执行大量查询,这对性能不利。但是您能解释一下为什么结果中的每个订单商品行还包含客户数据是个问题吗?
    • 我创建了一个页面,显示订单的所有详细信息,即订单商品和客户详细信息。当我想回显检索到的订单信息时,就会出现问题。因此,如果一位客户订购了两件商品,则会显示这两件商品,但客户详细信息也将显示两次
    • 您能否显示您的代码中您回显/输出数据的部分?这样可能更容易给出正确答案。
    • @user999267 显示原始问题中的代码,您可以对其进行编辑。
    猜你喜欢
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2021-11-09
    • 2017-08-13
    • 2019-10-21
    相关资源
    最近更新 更多