2011-10-17 81 views
0

您好我正在運行一個查詢從多個表中檢索結果。合併/刪除重複的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 ; 
      } 
+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()函數檢查它。

+0

嘿,謝謝你的回覆。看來你的建議現在會起作用。內存使用情況是您不推薦此解決方案的原因嗎?我現在在考慮替代品時遇到麻煩!如何實現這個目標呢? – user999267

+0

如果你有很多客戶,你必須執行很多查詢,這對性能不利。但是,您能否解釋爲什麼結果中的每個訂單商品行都包含客戶數據? –

+0

我製作了一個頁面,顯示訂單的所有細節訂單項目和客戶詳細信息。出現問題時,我想回複檢索到的訂單信息。因此,如果一位顧客訂購了兩件商品,那麼這兩件商品將會顯示,但顧客的詳細信息也會顯示兩次。 – user999267

0

您應該像這樣使用羣組:group by customer_id