programing

여러 개의 하위 행을 하나의 행 MYSQL로 결합

newsource 2022. 9. 24. 12:39

여러 개의 하위 행을 하나의 행 MYSQL로 결합

미리 감사드려요, 도저히 이해가 안 돼요!

테이블이 두 개 있어요.

주문필_아이템

ID | Item_Name1 | 피자2 | 스트롬볼리

Ordered_옵션

주문필_Item_ID | Option_Number | 값1 43 페퍼로니1 44 추가 치즈2 44 엑스트라 치즈

제가 출력하고자 하는 것은 mysql 쿼리가 이 취지의 무언가라는 것입니다.

산출량

ID | Item_Name | Option_1 | Option_2피자 페퍼로니 엑스트라 치즈 1개스트롬볼리 늘 엑스트라 치즈 2개

구문 오류로 끝나는 수많은 옵션을 시도했습니다.group_concat도 시도했지만 실제로는 그렇게 하지 않았습니다.시작이라고 생각되는 것의 대략적인 예가 아래에 있습니다.매번 같은 순서로 옵션이 필요합니다.정보가 수집되는 프로그램에서는 신뢰할 수 있는 방법이 없습니다.옵션 번호에 따라 연결할 수 있습니까?또, 5개 이상의 옵션은 없기 때문에, 스태틱한 솔루션이 유효하게 되는 것을 알고 있습니다.

Select Ordered_Items.ID,
    Ordered_Items.Item_Name,
FROM Ordered_Items
    JOIN (SELECT Ordered_Options.Value FROM Ordered_Options Where Option_Number = 43) as Option_1 
        ON Ordered_Options.Ordered_Item_ID = Ordered_Item.ID
    JOIN (SELECT Ordered_Options.Value FROM Ordered_Options Where Option_Number = 44) as Option_2 
        ON Ordered_Options.Ordered_Item_ID = Ordered_Item.ID;

고마워! 조!

여기서 GROUP_CONCAT 그룹 함수를 이용하는 것이 가장 쉬운 방법입니다.

select
  ordered_item.id as `Id`,
  ordered_item.Item_Name as `ItemName`,
  GROUP_CONCAT(Ordered_Options.Value) as `Options`
from
  ordered_item,
  ordered_options
where
  ordered_item.id=ordered_options.ordered_item_id
group by
  ordered_item.id

출력:

Id              ItemName       Options

1               Pizza          Pepperoni,Extra Cheese

2               Stromboli      Extra Cheese

이렇게 하면 쿼리를 수정할 필요 없이 원하는 수의 옵션을 사용할 수 있습니다.

아, 결과가 잘린 경우 GROUP_CONCAT의 크기 제한을 다음과 같이 늘릴 수 있습니다.

SET SESSION group_concat_max_len = 8192;

도움에 감사드리며, 누군가가 효과성에 대해 언급해 준다면 해결책을 찾을 수 있을 것 같습니다.본질적으로 내가 한 일은.실장에서는 다소 정적인 것을 알 수 있습니다만, 필요한 것을 실시하고 있습니다(잘못된 구문을 사용할 수 없습니다).

SELECT
  ordered_item.id as `Id`,
  ordered_item.Item_Name as `ItemName`,
  Options1.Value
  Options2.Value
FROM ORDERED_ITEMS
LEFT JOIN (Ordered_Options as Options1)
    ON (Options1.Ordered_Item.ID = Ordered_Options.Ordered_Item_ID 
        AND Options1.Option_Number = 43)
LEFT JOIN (Ordered_Options as Options2)
    ON (Options2.Ordered_Item.ID = Ordered_Options.Ordered_Item_ID
        AND Options2.Option_Number = 44);

결과에 여러 열이 필요하고 옵션 수가 제한된 경우 다음과 같은 작업을 수행할 수도 있습니다.

select
  ordered_item.id as `Id`,
  ordered_item.Item_Name as `ItemName`,
  if(ordered_options.id=1,Ordered_Options.Value,null) as `Option1`,
  if(ordered_options.id=2,Ordered_Options.Value,null) as `Option2`,
  if(ordered_options.id=43,Ordered_Options.Value,null) as `Option43`,
  if(ordered_options.id=44,Ordered_Options.Value,null) as `Option44`,
  GROUP_CONCAT(if(ordered_options.id not in (1,2,43,44),Ordered_Options.Value,null)) as `OtherOptions`
from
  ordered_item,
  ordered_options
where
  ordered_item.id=ordered_options.ordered_item_id
group by
  ordered_item.id

원하는 것을 피벗이라고 하며 MySQL에서 직접 지원되지 않습니다. 다음 답변에서 사용 가능한 옵션을 확인하십시오.

MySQL entity-attribute-value 스키마를 피벗하는 방법

최대 옵션이 한정되어 있는 경우는, 다음과 같이 시험합니다(주문당 최대 4개의 옵션).

OI를 선택합니다.ID, OI.Item_Name, OO1.값, OO2.값, OO3.값, OO4.가치
주문 후_아이템 OI좌측 가입 주문_옵션 OO1 ON OO1.주문필_Item_ID = OI.아이디왼쪽 조인 주문 완료_OO2 ON OO2 옵션.주문필_Item_ID = OI.아이디와 OO2.아이디!= OO1.아이디좌측 가입 주문_옵션 OO3 ON OO3.주문필_Item_ID = OI.신분증과 OO3.아이디!= OO1.신분증과 OO3.아이디!= OO2.아이디좌측 가입 주문_옵션 OO4 ON OO4.주문필_Item_ID = OI.아이디와 OO4.아이디!= OO1.아이디와 OO4.아이디!= OO2.아이디와 OO4.아이디!= OO3.아이디
OI별 그룹화.ID, OI.Item_Name

조건별 그룹은 그렇지 않으면 얻을 수 있는 모든 중복을 제거합니다.현재 작업 중인 사이트에서도 비슷한 기능을 구현했습니다.이 사이트에서는 항상 자녀 테이블에 1, 2개가 일치합니다.또한 각 부모 항목에 대해 1개의 행밖에 없음을 확인하고 싶었습니다.

이 유형의 요건에 대한 쿼리를 구성하는 방법은 다음과 같습니다.

select ID,Item_Name,max(Flavor) as Flavor,max(Extra_Cheese) as Extra_Cheese
    from (select i.*,
                    case when o.Option_Number=43 then o.value else null end as Flavor,
                    case when o.Option_Number=44 then o.value else null end as Extra_Cheese
                from Ordered_Item i,Ordered_Options o) a
    group by ID,Item_Name;

기본적으로 각 열을 "케이스 아웃"하는 방법은 다음과 같습니다.case when를 선택합니다.max()각 컬럼에 대해group by각 의도된 항목에 대해.

Joe Edel의 대답은 실제로 피벗 문제를 해결하기 위한 올바른 접근법입니다.

기본적으로 기본 테이블의 열을 나열하고 다음으로 임의의 개수의 열을 나열하는 것입니다.options.value참조할 수 있습니다.그저.left join모든 옵션을 가져오기 위해 동일한 옵션 테이블을 여러 번 사용합니다.

프로그래밍 언어로 수행해야 하는 것은 쿼리해야 하는 옵션 목록에 따라 이 쿼리를 동적으로 구축하는 것입니다.

언급URL : https://stackoverflow.com/questions/1067428/combine-multiple-child-rows-into-one-row-mysql