2012-11-21 2 views
0

내 mysql 구문에 대한 도움이 필요합니다.하나의 필드에서 동일한 데이터 셀 값을 갖고 있지만 다른 데이터 셀 값이 다른 두 개의 레코드

내 테이블에는 사용자 정보가 있지만 배송지와 청구서의 주문 번호는 동일합니다.

때때로 사람들은 청구서 수신 주소로 배송하기를 선택합니다. 사용자가 배송 주소를 입력하지 않은 주문 번호 레코드와 배송 주소를 입력 한 위치 만 필요합니다.

청구서 수신 주소와 배송 주소가 모두 입력 된 경우 배송 주소 만 필요합니다.

표에서 한 주문 번호에 대해 중복 된 필드가있는 경우가 있습니다. 그 혼란 경우 아래를 살펴 :

------------SQL TABLE ----------- 
order_id | address_type | user_name  | address 
100  | billto  | Homer Simposn | 123 Main St. 
100  | shipto  | Homer Simpson | 455 XYZ Ave. 
101  | billto  | Peter Griffin | 780 111th St. 
102  | billto  | Charles Xavier | 555 Bergen St. 
102  | shipto  | Jean Gray  | 555 Bergen St. 

내가 할 출력을 필요

100 - shipto - Homer Simposn - 455 XYZ Ave. 
101 - billto - Peter Griffin - 780 111th St. 
102 - shipto - Jean Gray - 555 Bergen St. 

여기 전용 "shipto"레코드를 반환합니다 내 구문입니다.

SELECT * FROM order_info AS A WHERE A.address_type = 'shipto' AND 
NOT EXISTS (SELECT B.address_type 
        from order_info AS B 
        where B.address_type = A.address_type 
        and B.address_type = 'billto') 

나는이 SQL 구문의 모든 작업을 수행 할 수 있으며, 더 shipto는 다음 billto 반환이없는 IF 같은 것을 원하십니까?

감사합니다.

답변

1

귀하의 행에 groupwise maximum을 입력하면됩니다.

은 특히,이 ID로 순서를 사용하고, (가 billto없는 경우가 있다면 shipto을 찾을 것이다) 하위 쿼리에서 "최대"주소 유형을 발견하고, 행에 연결하기 위해 그 결과를 사용 외부 질의. (비효율적 상관 서브 쿼리를 사용하여) 예를 들어

는 :

SELECT * FROM order_info AS A WHERE A.address_type = (
    SELECT MAX(address_type) FROM order_info AS B 
    WHERE A.order_id = B.order_id) 

above link보다 효율적으로 조인 변환의 일례를 제공한다.

+0

매우 혁신적인 ... 지금부터이 시점에서 물건을 보게 될 것입니다. thanks :) –

+0

답장을 보내 주셔서 감사합니다. 나는 당신이 의미하는 것에 여전히 약간의 도움이 필요하다. 나는 SELECT * FROM jos_vm_order_user_info를 사용했다. WHERE order_id = (select MAX (B.order_id) FROM jos_vm_order_user_info B WHERE A.address_type = B.address_type)'그러나 최대 발견 된 주문 번호를 가진 2 개의 레코드 만 반환한다. billto'와'ship to to '을 의미한다. 레코드 번호와 마찬가지로 '101 - billto - Peter Griffin - 780 111th St.'과 102 - shipto - Jean Gray - 555 Bergen St.' – Far

+0

다른 방법으로해야합니다.'order_id '에 가입하고 최대 값을 선택하십시오. 'address_type'. 내 대답에 쿼리를 복사하고'order_info'를'jos_vm_order_user_info'로 바꾸고 그것이 작동하는지 확인하십시오. –

0
select * from test 
where address_type = "shipto" 
union 
select * from test t1 
where address_type = "billto" 
and (select count(*) from test t2 where t2.order_id = t1.order_id group by order_id) = 1; 

얼마나 효율적인지는 확실하지 않지만 결과가 확실합니다. 실적을 다른 방법으로 비교할 수 있습니다.

+0

나는 upvote하고 싶다 그러나 나는 충분한 rep가 없다. :/ – Far

+0

권자. .. 그것에 대해 걱정하지 마라.. 어떤 경우라도, 나는 2보다 느릴 것 인 3 개의 질문을 사용하고있다 : P –

관련 문제