ActiveRecord 왼쪽 외부 조인 이해


왼쪽 외부 연결이란 무엇이며 언제 사용합니까?
왼쪽 외부 연결(또는 왼쪽 연결만)은 관련 표의 일치 항목과 일치하지 않는 항목에 따라 표를 조회하는 데 사용됩니다.내부 연결과 반대로 연결 조건이 오른쪽 테이블에서 일치하는 항목을 찾지 못하더라도 왼쪽 외부 연결은 왼쪽 테이블의 모든 항목을 되돌려줍니다.
다음 연습을 다시 시작하겠습니다.
다음은 도메인 모델입니다.
class Accommodation < ApplicationRecord
  has_many :bookings
end
class Booking < ApplicationRecord
  belongs_to :accommodation
end
Accommodation.all
신분증
성함
1
"해변 별장".
2
"매혹적인 집".

'리스본 아파트'.
4
"오두막집".
5
"농가"
Booking.all
신분증
숙박
체크인
체크아웃
1
1
2021년 6월 20일
2021년 6월 23일
2
1
2021년 8월 7일
2021년 8월 8일

2
2021년 5월 22일
2021년 5월 28일
4
4
2021년 4월 1일
2021년 4월 2일

모든 숙박 안배를 그들의 예약과 함께 계산하다
숙박 목록을 되돌리려면 accommodations표를 조회해야 합니다.그러나 우리는 이 목록을 되돌려주고 관련 표 bookings 에서 계산 결과를 내보내야 한다.가입이 필요합니다.
Recapping Part I of this series 먼저 ActiveRecordjoins 방법을 사용해 보겠습니다.
Accommodation.joins(:bookings)
SQL에서는 다음과 같이 변환됩니다INNER JOIN.
SELECT "accommodations".* FROM "accommodations" INNER JOIN "bookings" ON "bookings"."id" = "accommodations"."booking_id"

내부 연결 테이블
숙박하다.신분증
숙박하다.이름:
예약하다.신분증
예약하다.숙박비
예약하다.등기하다
예약하다.체크아웃
1
"해변 별장".
1
1
2021년 6월 20일
2021년 6월 23일
1
"해변 별장".
1
1
2021년 8월 7일
2021년 8월 8일
2
"매혹적인 집".
2
2
2021년 5월 22일
2021년 5월 28일
4
"오두막집".
4
4
2021년 4월 1일
2021년 4월 2일
그러면 다음 숙박 항목이 반환됩니다.
신분증
성함
1
"해변 별장".
1
"해변 별장".
2
"매혹적인 집".
4
"오두막집".
되돌아오는 액티브 레코드 대상자는 리스본 아파트와 농가 숙박은 포함되지 않는다. 내부 연결은 일치하는 예약이 있는 숙박만 되돌아오기 때문이다.이것은 이상적인 결과가 아니다. 왜냐하면 우리는 모든 숙박의 모든 예약을 총화하기를 원하기 때문이다. 설령 이것이 우리가 제로 숙박을 받을 수 있다는 것을 의미한다고 해도.
이것이 바로 좌외 연결에 도움이 되는 곳이다.

ActiveRecordleft_joins/left_outer_joins 방법
이제 railsjoins가 아니라 left_joins(당신도 그것의 별명left_outer_joins을 사용해 보십시오):
Accommodation.left_joins(:bookings)
다음 SQL을 생성합니다.
SELECT "accommodations".* FROM "accommodations" LEFT OUTER JOIN "bookings" ON "bookings"."id" = "accommodations"."booking_id"

왼쪽 외접표
숙박과 예약이 연결되면 다음과 같은 상황이 발생한다.
숙박하다.신분증
숙박하다.이름:
예약하다.신분증
예약하다.숙박비
예약하다.등기하다
예약하다.체크아웃
1
"해변 별장".
1
1
2021년 6월 20일
2021년 6월 23일
1
"해변 별장".
1
1
2021년 8월 7일
2021년 8월 8일
2
"매혹적인 집".
2
2
2021년 5월 22일
2021년 5월 28일

'리스본 아파트'.
무효이었어
무효이었어
무효이었어
무효이었어
4
"오두막집".
4
4
2021년 4월 1일
2021년 4월 2일
5
"농가"
무효이었어
무효이었어
무효이었어
무효이었어
이 탁자를 봐라, 몇 가지 일이 매우 두드러진다.우선 내부에 연결된 표에서처럼'비치하우스'는 두 차례 등장했다. 이 아파트는 두 가지 다른 예약이 있는데, 하나는 6월 예약이고, 다른 하나는 8월 예약이기 때문이다.그러나 이 두 가지 연결 방법의 차이점은 현재 내부 연결에서 빠진 두 가지 항목, 즉 리스본 아파트와 농가가 있다는 점이다.그러나 bookings 테이블의 속성과 관련된 값은 "null"입니다.따라서 두 방은 예약 데이터가 없지만 조회할 수 있다.
기억해라: bookings 테이블의 열은 현재 데이터베이스에서 조회할 수 있지만, 프로그램으로 전송되지 않고 Active Record 대상에 내장되지 않는다.
따라서 쿼리를 실제로 실행할 때, 이것은ActiveRecord가 되돌아오는 결과입니다.
숙박한다
신분증
성함
1
"해변 별장".
1
"해변 별장".
2
"매혹적인 집".

'리스본 아파트'.
4
"오두막집".
5
"농가"
이제 Active Recordgroupcount 방법으로 숙박 명칭에 따라 그룹을 나누는 예약을 통계해 봅시다.
Accommodation.left_joins(:bookings).group(:name).count('bookings.id')
다음은 생성된 SQL입니다.
SELECT COUNT("bookings"."id") AS count_bookings_id, "accommodations"."id" AS accommodations_id FROM "accommodations" LEFT OUTER JOIN "bookings" ON "bookings"."accommodation_id" = "accommodations"."id" GROUP BY "accommodations"."name"
이것은 숙박 이름을 키로 하고 예약 계수를 값으로 하는 데 필요한 출력을 되돌려줍니다.모든 숙박을 열거하였으며, 모든 숙박은 제로 예약이라도 자신의 예약이 있었다.
{"Beach House"=>2, "Charming House"=>1, "Lisbon Flat"=>0, "Le Petit Chalet"=>1, "Farm House"=>0}

SQL 문자열을 사용하여 조인 사용자 정의left_joinsleft_outer_joins 방법은 rails 5.2.3 이후 버전에만 적용된다.rails의 초기 버전을 사용한다면, 연결 방법이 필요한 SQL 문자열을 전달하여 rails joins 방법을 맞춤형으로 만들어야 합니다.
이것은
Accommodation.left_joins(:bookings)
다음과 같이 써야 합니다.
Accommodation.joins('LEFT OUTER JOIN bookings ON bookings.accommodation_id = acommodations.id")

예약하지 않은 상태에서 모든 숙박을 얻다
이제 우리는 아무런 예약도 하지 않은 숙박만 얻고 싶다고 말했다.
우리는 현재 left_joins 예약하지 않은 숙박을 포함할 것을 알고 있지만, 예약한 다른 숙박도 모두 포함할 것이다.그러면, 우리는 어떻게 이 목록을 필터해서 예약하지 않은 숙박만 되돌려 줍니까?앞에서 연습한 왼쪽 외부 연결표를 보면 이 두 그룹의 차이점은 예약된 숙박은 정수치가 있는 속성bookings.id이 있고 예약하지 않은 숙박은 같은 속성null이 있다는 것이다.
따라서 우리는 where를 이용해서 빈값bookings.id만 받을 수 있다는 것을 알고 있다.
Accommodation.left_joins(:bookings).where(bookings: { id: nil })
SQL:
SELECT COUNT(*) FROM "accommodations" LEFT OUTER JOIN "bookings" ON "bookings"."accommodation_id" = "accommodations"."id" WHERE "bookings"."id" IS NULL
반환된 출력:
신분증
성함

'리스본 아파트'.
5
"농가"
만약 rails 6에 있다면,Active Record missing 방법으로 이 해결 방안을 더욱 의미 있는 버전으로 작성할 수 있습니다.이렇게 하면 이전과 동일한 SQL 및 출력이 생성됩니다.
Accommodation.where.missing(:bookings)
이 시리즈의 세 번째 부분에서, 나는 계속해서 몇 가지 예시를 소개할 것이며, 이번에는 어떻게 같은 검색에서 여러 개의 연결을 조합하는지 설명할 것이다.

좋은 웹페이지 즐겨찾기