2011-10-17 4 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.의 첫 x 째 부분에 지정하는 속성의 데이터를 포함합니다.

실제 질문은이 데이터를 두 번 검색하면 문제가되는 것입니다. 검색하는 모든 데이터를 사용하려면 이 없습니다. 이미 고객의 데이터를 처리 한 경우이를 무시할 수 있습니다.

다른 권장 사항은 하나의 쿼리로 모든 고객 데이터를 검색 한 다음 다른 쿼리를 사용하여 주문 항목을 검색하는 것입니다.

편집 :이 이 코드는 사용자가 제공 한 코드 예제를 기반으로 작동합니다 :

// 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