您好我正在运行一个从多个表中检索结果的查询。
我的查询从一个名为“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 ;
}
答案 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