合并/删除重复的MySQL查询结果

时间:2011-10-17 13:49:32

标签: php mysql

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

我的查询从一个名为“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 ;
            }

2 个答案:

答案 0 :(得分:0)

你想做什么是不可能的。 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()函数进行检查。

答案 1 :(得分:0)

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