MySQL의 여러 테이블에서 선택하는 방법
-
GROUP BY
food
를 사용하여 여러 테이블에서 선택 -
JOIN
을 사용하여 MySQL의 여러 테이블에서 선택 -
GROUP_CONCAT()
를 사용하고 MySQL에서 결과를 조작합니다
이 가이드에서는 MySQL을 사용하여 단일 스크립트의 여러 테이블에서SELECT
를 쿼리하는 방법을 보여줍니다.
하나의 시나리오를 시연 해 보겠습니다.
SELECT name, price, details, type, FROM food, food_order WHERE breakfast.id = 'breakfast_id'
이제 각FROM
항목에 대한 샘플 테이블을 상상해 보겠습니다.
food
food_id | name | price | options |
---|---|---|---|
1 | Eggs | 10.00 | Scrambled, Sunny Side, Boiled |
2 | Ice cream | 30.00 | Vanilla, Strawberry, Chocolate |
3 | Ramen | 12.00 | Regular, Spicy |
food_menu
order_id | photo | food_id |
---|---|---|
1 | eggs_scrambled.jpg | 1 |
2 | eggs_sunnyside.jpg | 1 |
3 | eggs_boiled.png | 1 |
4 | icecream_vanilla.jpg | 2 |
5 | icecream_strawberry.jpg | 2 |
6 | ice_cream_chocolate.jpg | 2 |
7 | ramen_regular.jpg | 3 |
8 | ramen_spicy.jpg | 3 |
위의 표를 보면 계란에는 3 장, 아이스크림에는 3 장,라면에는 2 장의 사진이 있습니다. 우리가 만들고자하는 출력은 food
와 food_menu
의 집계 테이블이며 모든 음식을 함께 표시합니다. 메뉴의 해당 사진과 결합합니다.
이것을 쿼리하면 :
SELECT name, price, options, photo
FROM food, food_menu
WHERE food_id = '1'
결과는 다음과 같습니다.
name | price | options | photo |
---|---|---|---|
1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg |
2 | Eggs | Scrambled, Sunny Side, Boiled | eggs_scrambled.jpg |
3 | Eggs | Scrambled, Sunny Side, Boiled | eggs_boiled.jpg |
food
와 관련된 food_menu
행이 여러 개 있으므로 데이터가 중복됩니다. 이 경우 food_menu
에 계란과 직접 연결된 사진이 3 장 있습니다.
모든 항목이 food
테이블과 관련된 별도의 항목으로 간주되기 때문에 간단한 쿼리로 food_menu
의 모든 항목을 단일 행에 결합 할 수 없습니다.
food
과 food_menu
를 동시에 단일 행으로 쿼리하려는 경우 다음과 같은 몇 가지 옵션을 사용할 수 있습니다.
GROUP BY food
를 사용하여 여러 테이블에서 선택
이 접근 방식은 GROUP BY
를 사용하여 두 테이블을 하나의 결과로 집계합니다. 그러나 단점은 결과가 고유하도록 강제하기 때문에food_menu
의 첫 번째 인스턴스 만 얻을 수 있다는 것입니다.
다음은GROUP BY
food
테이블에 대한 쿼리입니다.
SELECT name, price, options, photo
FROM food, food_menu
WHERE food_id = '1'
GROUP BY food_id
그러면 다음 결과가 표시됩니다.
name | price | options | photo |
---|---|---|---|
1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg |
쿼리에서 찾은food_menu
의 첫 번째 인스턴스 인 사진이 하나만 반환되지만 이제 조건을 충족했습니다.
JOIN
을 사용하여 MySQL의 여러 테이블에서 선택
이 접근 방식은 SQL의JOIN
또는RIGHT JOIN
명령을 사용합니다.
스크립트에 2 개의 FROM 조건이있는 대신 food_id
외래 키를 기반으로 food_menu
에 가입합니다. food
는f
,food_menu
는fm
으로 별칭을 지정했습니다.
SELECT f.name, f.price, f.options, fm.food_menu
FROM food AS f
JOIN food_menu AS fm ON fm.food_id = f.food_id
WHERE food_id = '1'
GROUP BY f.food_id
이 방법은 이전 방법과 다르지만 동일한 결과를 생성합니다. GROUP BY는 쿼리가 조건에 따라 고유 한 행을 반환하도록 강제하기 때문에 food_menu
의 첫 번째 인스턴스를 반환합니다.
name | price | options | photo |
---|---|---|---|
1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg |
GROUP_CONCAT()
를 사용하고 MySQL에서 결과를 조작합니다
이전 솔루션의 문제에 대한 해결 방법은GROUP_CONCAT()
를 사용하여food_menu
의 모든 결과를 단일 문자열에 넣는 것이므로 모든 레코드를 단일 행에 넣을 수 있습니다.
GROUP_CONCAT()
는 무엇입니까?
GROUP_CONCAT
는 여러 행의 데이터를 단일 필드로 결합하는 함수입니다. 그룹에 null이 아닌 값이 1 개 이상 포함 된 경우 수정 된 문자열을 반환하는 GROUP BY
특수 함수입니다. 그렇지 않으면 NULL
을 반환합니다.
위의 쿼리를GROUP_CONCAT()
사진 열로 수정하여 결과를 하나의 문자열로 연결합니다.
SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu
WHERE food_id = '1'
GROUP BY food_id
이렇게하면food_menu
의 사진 열을 연결하여food
의 고유 항목 당 하나의 행만 생성되도록합니다. 결과는 다음과 같이 표시됩니다.
name | price | options | photo |
---|---|---|---|
1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg,eggs_scrambled.jpg,eggs_boiled.jpg |
보시다시피 food
테이블에서 Eggs와 관련된 3 개의 photo
열을 연결했습니다.
GROUP BY
및WHERE
조건을 제거하면.
SELECT name, price, options, GROUP_CONCAT(photo, ', ')
FROM food, food_menu
결과는 다음과 같습니다.
name | price | options | photo |
---|---|---|---|
1 | Eggs | Scrambled, Sunny Side, Boiled | eggs_sunnyside.jpg,eggs_scrambled.jpg,eggs_boiled.jpg |
2 | Ice Cream | Vanilla, Strawberry, Chocolate | icecream_vanilla.jpg,icecream_strawberry.jpg,icecream_chocolate.jpg |
3 | Ramen | Regular, Spicy | ramen_regular.jpg,ramen_spicy.jpg |
문자열에 쉼표가 포함되어 있고 CONCAT 구분 기호도 쉼표 인 경우 GROUP_CONCAT() 사용에주의하십시오. 열을 구문 분석하면 데이터가 손상 될 수 있습니다.
따라서이 함수를 사용하기 전에 구분 기호가 조작중인 열에 대해 유효하지 않은 문자인지 확인하십시오.
Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.
LinkedIn