IT/SQLD

MySQL의 여러 테이블에서 선택하는 방법

알콩달콩아빠 2023. 11. 1. 14:20
728x90
반응형
  1. GROUP BY food를 사용하여 여러 테이블에서 선택
  2. JOIN을 사용하여 MySQL의 여러 테이블에서 선택
  3. GROUP_CONCAT()를 사용하고 MySQL에서 결과를 조작합니다

이 가이드에서는 MySQL을 사용하여 단일 스크립트의 여러 테이블에서SELECT를 쿼리하는 방법을 보여줍니다.

Powered By
 
Play
Unmute
 
 
Loaded: 1.17%
Fullscreen

하나의 시나리오를 시연 해 보겠습니다.

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() 사용에주의하십시오. 열을 구문 분석하면 데이터가 손상 될 수 있습니다.

따라서이 함수를 사용하기 전에 구분 기호가 조작중인 열에 대해 유효하지 않은 문자인지 확인하십시오.

 

출처 : MySQL의 여러 테이블에서 선택하는 방법 | Delft Stack

728x90
반응형