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

Php 合并/删除重复的MySQL查询结果,php,mysql,Php,Mysql,嗨,我正在运行一个从多个表检索结果的查询 我的查询从一个名为store\u orders\u items的表中检索订单,并从另一个名为store\u orders的表中检索相应的客户详细信息 但是,如果一个客户有两个订单,则查询将检索两次客户详细信息,而查询将根据客户id号选择订单 因此,我得到了两份订单的详细信息,这很好,但也得到了两份我不想要的客户详细信息 如何调整查询以检索所有订单,并仅检索每个订单的客户详细信息 以下是到目前为止的问题: "SELECT

嗨,我正在运行一个从多个表检索结果的查询

我的查询从一个名为store\u orders\u items的表中检索订单,并从另一个名为store\u 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 ;
            }

你想做的是不可能的。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\u orders变量中至少有一行。如果情况并非总是如此,那么在执行此代码之前,您应该使用mysql\u num\u rows函数检查这一点。

您应该像这样使用group by:group by customer\u id

为什么只需要一次客户详细信息?从第一行开始读,在后面的几行中忽略它们。嘿,谢谢你的回复。看来你的建议暂时行得通。内存使用是您不推荐此解决方案的原因吗?我现在很难想出一个替代方案!如果你有很多客户,你必须执行很多查询,这对性能是不利的。但是,您能解释一下为什么结果中的每个订单项目行都包含客户数据是一个问题吗?我制作了一个页面,显示订单的所有详细信息,即订单项目和客户详细信息。当我想要回显订单的检索信息时,问题就出现了。因此,如果一位客户订购了两个项目,则将显示这两个项目,但客户详细信息也将显示两次。您是否可以显示代码中回显/输出数据的部分?这可能会使给出正确答案更容易。@user999267在原始问题中显示代码,您可以编辑它。