여러 개의 하위 행을 하나의 행 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
'programing' 카테고리의 다른 글
'shell='의 실제 의미하위 프로세스에서 참' (0) | 2022.09.24 |
---|---|
PDO 버전 Atribut은 어디에서 유래합니까? (0) | 2022.09.24 |
MySQL과 MariaDB 쿼리 실행 계획의 차이점 (0) | 2022.09.24 |
fragment를 액티비티 그룹 내의 다른 fragment로 대체 (0) | 2022.09.24 |
방금 실행한 mysql 문을 취소하려면 어떻게 해야 하나요? (0) | 2022.09.24 |