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

Rayven Esplanada 2023년1월30일
  1. GROUP BY food를 사용하여 여러 테이블에서 선택
  2. JOIN을 사용하여 MySQL의 여러 테이블에서 선택
  3. GROUP_CONCAT()를 사용하고 MySQL에서 결과를 조작합니다
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 장의 사진이 있습니다. 우리가 만들고자하는 출력은 foodfood_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의 모든 항목을 단일 행에 결합 할 수 없습니다.

foodfood_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에 가입합니다. foodf,food_menufm으로 별칭을 지정했습니다.

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 BYWHERE 조건을 제거하면.

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

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

Rayven Esplanada avatar Rayven Esplanada avatar

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

관련 문장 - MySQL Table