Program Tip

SELECT * FROM 여러 테이블.

programtip 2020. 11. 21. 09:26
반응형

SELECT * FROM 여러 테이블. MySQL


SELECT name, price, photo FROM drinks, drinks_photos WHERE drinks.id = drinks_id

yeilds 5 개 행 (5 개 배열) photo은 행에서 유일한 고유 필드입니다. name, price반복된다 ( 여기, fanta- name, price 3 번 반복한다. ) 이러한 중복을 제거하려면 어떻게해야합니까?

편집 : 나는 각 음료에 대해 name, price모든 것을 원합니다 photo.

 id      name      price
  1.    fanta        5
  2.     dew         4


 id      photo                   drinks_id
  1.     ./images/fanta-1.jpg      1
  2.     ./images/fanta-2.jpg      1  
  3.     ./images/fanta-3.jpg      1 
  4.     ./images/dew-1.jpg        2
  5.     ./images/dew-2.jpg        2

여기서 수행하는 작업을 a라고합니다 JOIN(여러 테이블에서 선택하기 때문에 암시 적으로 수행하지만). 즉, WHERE 절에 조건을 입력하지 않으면 해당 테이블의 모든 조합 이있는 것입니다. 조건이있는 경우에만 음료 ID가 일치하는 행으로 조인을 제한합니다.

그러나이 특정 drinks_id가있는 사진이 X 개인 경우 모든 음료에 대한 결과에는 여전히 X 개의 여러 행이 있습니다. 귀하의 성명은 제한하지 않습니다 어떤 당신이 원하는 사진 (들)!

음료 당 하나의 행만 원하는 경우 특정 drink_id가있는 여러 행이있는 경우 수행 할 작업을 SQL에 알려야합니다. 이를 위해서는 그룹화 및 집계 함수 가 필요 합니다 . 함께 그룹화 할 항목 (예 : 모두 동일한 drink_ids)을 SQL에 알리고 SELECT에서 각 그룹화 된 결과 행에 대해 취해야하는 고유 항목을 지정해야합니다. 숫자의 경우 평균, 최소, 최대가 될 수 있습니다.

당신의 경우에는 한 줄만 원하면 사진에 음료수를 쿼리하는 감각을 볼 수 없습니다. 각 음료에 대한 결과 에 사진 배열 이있을 수 있다고 생각했을 수도 있지만 SQL은이를 수행 할 수 없습니다. 어떤 사진 만 원하고 어떤 사진을 얻을지 신경 쓰지 않는다면, Drinks_id로 그룹화하세요 (음료 당 한 줄만 얻으려면) :

SELECT name, price, photo
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id

name     price   photo
fanta    5       ./images/fanta-1.jpg
dew      4       ./images/dew-1.jpg

MySQL 에는 파일 이름을 하나의 단일 문자열에 연결하려는 경우 GROUP_CONCAT 도 있습니다 .

SELECT name, price, GROUP_CONCAT(photo, ',')
FROM drinks, drinks_photos
WHERE drinks.id = drinks_id 
GROUP BY drinks_id

name     price   photo
fanta    5       ./images/fanta-1.jpg,./images/fanta-2.jpg,./images/fanta-3.jpg
dew      4       ./images/dew-1.jpg,./images/dew-2.jpg

그러나 ,이는 클라이언트 측에서 다시 분할 할 가능성이 높기 때문에 필드 값 내에 있으면 위험 할 수 있습니다 . 또한 표준 SQL 집계 함수가 아닙니다.


여기에 이름과 가격에 대한 중복 값이 ​​있습니다. 그리고 drink_photos 테이블에 id가 중복되어 있습니다. 피할 수있는 방법이 없습니다.


중복을 제거하려면으로 그룹화 할 수 있습니다 drinks.id. 그러나 그렇게하면 각각에 대해 하나의 사진 만 얻을 수 있습니다 drinks.id(어떤 사진을 얻을지는 데이터베이스 내부 구현에 따라 다름).

문서화되어 있지는 않지만 MySQL의 경우 가장 낮은 사진을 얻을 수 있습니다 id(내 경험상 다른 행동을 본 적이 없습니다).

SELECT name, price, photo 
FROM drinks, drinks_photos 
WHERE drinks.id = drinks_id
GROUP BY drinks.id

참고 URL : https://stackoverflow.com/questions/12890071/select-from-multiple-tables-mysql

반응형