programing

하나의 행을 다른 테이블의 여러 행에 결합

easyjava 2023. 9. 21. 21:37
반응형

하나의 행을 다른 테이블의 여러 행에 결합

개체(사용자라고 함) 및 속성(한 사람이 임의의 개수의 속성을 가질 수 있음)에 대한 테이블이 있습니다.예:

사람

Name  Age
--------
Jane  27
Joe   36
Jim   16

특성.

Name   Property
-----------------
Jane   Smart
Jane   Funny
Jane   Good-looking
Joe    Smart
Joe    Workaholic
Jim    Funny
Jim    Young

저는 나이에 따라 사람들을 선택하고 그들의 재산을 전부 혹은 일부 돌려주는 효율적인 선택을 쓰고 싶습니다.

Ex: People older than 26
Name Properties
Jane Smart, Funny, Good-looking
Joe Smart, Workaholic

또한 속성과 총 속성 개수 중 하나를 반환할 수 있습니다.

쿼리는 효율적이어야 합니다. 사용자 테이블에는 수백만 개의 행이 있고 속성 테이블에는 수십만 개의 행이 있습니다(따라서 대부분의 사용자는 속성이 없습니다).한 번에 수백 개의 행이 선택됩니다.

방법이 없을까요?

용도:

   SELECT x.name,
          GROUP_CONCAT(y.property SEPARATOR ', ')
     FROM PEOPLE x
LEFT JOIN PROPERTIES y ON y.name = x.name
    WHERE x.age > 26
 GROUP BY x.name

Properties.property 값의 쉼표로 구분된 목록을 반환하기 위해 MySQL 함수 GROUP_CONCAT(문서)를 사용하려고 합니다.

속성 테이블에 값이 없는 피플 레코드를 포함시키기 위해 조인이 아닌 왼쪽 조인을 사용했습니다. - 속성 테이블에 값이 있는 피플의 목록만 원하는 경우 다음을 사용합니다.

   SELECT x.name,
          GROUP_CONCAT(y.property SEPARATOR ', ')
     FROM PEOPLE x
     JOIN PROPERTIES y ON y.name = x.name
    WHERE x.age > 26
 GROUP BY x.name

이것이 하나의 예라는 것을 알지만, 이름을 사용하는 것은 얼마나 많은 "John Smith"가 있는지를 고려할 때 참조하기에 적합하지 않은 선택입니다.사용자마다 고유한 값인 user_id를 할당하는 것이 더 나은 선택이 될 것입니다.

SELECT x.name,(select GROUP_CONCAT(y.Properties SEPARATOR ', ')
FROM PROPERTIES y 
WHERE y.name.=x.name ) as Properties FROM mst_People x 

이거 먹어봐요.

사용가능INNER JOIN두 테이블을 연결합니다.JOIN에 대한 자세한 내용.

SELECT *
FROM People P
INNER JOIN Properties Pr
  ON Pr.Name = P.Name
WHERE P.Name = 'Joe' -- or a specific age, etc

그러나 이러한 테이블에 고유한 기본 키를 추가하고 인덱스를 생성하여 속도를 높이는 것이 훨씬 빠른 경우가 많습니다.

테이블을 말해요People밭이 있습니다id
그리고 테이블은Properties밭이 있습니다peopleId그것들을 서로 연결시키다

그러면 쿼리는 다음과 같이 나타납니다.

SELECT *
FROM People P
INNER JOIN Properties Pr
  ON Pr.id = P.peopleId
WHERE P.Name = 'Joe'

언급URL : https://stackoverflow.com/questions/2892816/join-one-row-to-multiple-rows-in-another-table

반응형