- 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_idnamepriceoptions
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_idphotofood_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'
결과는 다음과 같습니다.
namepriceoptionsphoto
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
그러면 다음 결과가 표시됩니다.
namepriceoptionsphoto
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의 첫 번째 인스턴스를 반환합니다.
namepriceoptionsphoto
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의 고유 항목 당 하나의 행만 생성되도록합니다. 결과는 다음과 같이 표시됩니다.
namepriceoptionsphoto
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
결과는 다음과 같습니다.
namepriceoptionsphoto
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() 사용에주의하십시오. 열을 구문 분석하면 데이터가 손상 될 수 있습니다.
따라서이 함수를 사용하기 전에 구분 기호가 조작중인 열에 대해 유효하지 않은 문자인지 확인하십시오.
'IT > SQLD' 카테고리의 다른 글
[DB] Redis란 무엇일까? 간단하게 알아보기! (0) | 2024.01.16 |
---|---|
[MySQL] 여러 테이블 합쳐서 SELECT하기 - JOIN ~ ON ~ (0) | 2023.11.01 |
3개 이상의 테이블 LEFT JOIN 하기 (0) | 2023.11.01 |
[MySQL] Join (Outer Join, Inner Join) 설명 및 예제 (0) | 2023.11.01 |
[MySQL || MariaDB] 여러 테이블 한번에 카운터 하기 (0) | 2023.11.01 |