IT

SQL 쿼리에서 LEFT JOIN 순서를 정렬하는 방법

itgroup 2023. 1. 15. 17:04
반응형

SQL 쿼리에서 LEFT JOIN 순서를 정렬하는 방법

네, 구글에서 미친 듯이 답변을 검색해 봤지만, 이 문제를 해결할 수 없었기 때문에 누군가 도움을 주셨으면 합니다.

예를 들어 매우 간단한 사용자 테이블이 있다고 가정해 보겠습니다.

id | userName
3    Michael
4    Mike
5    George

그리고 다른 표로 그들의 차와 가격을 가지고 있습니다.

id | belongsToUser | carPrice
1    4               5000
2    4               6000
3    4               8000

여기서 해야 할 일은 다음과 같습니다(자유롭게 다시 쓰십시오).

   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'

반환되는 내용:

Mike | 5000

하지만 나는 처음 발견된 엔트리가 아니라 특정 사용자의 가장 비싼 차가 필요하다.

그래서 질문:왼쪽 조인 테이블을 carPrice로 주문하도록 설정하려면 어떻게 해야 합니까?

사용해보십시오.MAX와 함께GROUP BY.

SELECT u.userName, MAX(c.carPrice)
FROM users u
    LEFT JOIN cars c ON u.id = c.belongsToUser
WHERE u.id = 4;
GROUP BY u.userName;

상세 정보GROUP BY

그룹 기준 절은 열별 그룹의 고유한 조합을 기준으로 선택한 레코드를 그룹으로 분할하는 데 사용됩니다.그러면 집계 함수를 사용할 수 있습니다(예:각 레코드 그룹에 차례로 적용되는 MAX, MIN, SUM, AVG 등).데이터베이스는 각 그룹에 대해 단일 결과 레코드를 반환합니다.

예를 들어, 다음과 같은 표에 시간과 장소에 따른 온도를 나타내는 일련의 레코드가 있는 경우:

Location   Time    Temperature
--------   ----    -----------
London     12:00          10.0
Bristol    12:00          12.0
Glasgow    12:00           5.0
London     13:00          14.0
Bristol    13:00          13.0
Glasgow    13:00           7.0
...

다음으로 장소별로 최대 온도를 구하려면 온도 레코드를 그룹으로 분할해야 합니다.이 그룹에서는 특정 그룹의 각 레코드가 같은 위치를 가집니다.그런 다음 각 그룹의 최고 온도를 구하려고 합니다.이를 위한 쿼리는 다음과 같습니다.

SELECT Location, MAX(Temperature)
FROM Temperatures
GROUP BY Location;

이전 MySQL 버전이면 충분합니다.

SELECT
    `userName`,
    `carPrice`
FROM `users`
LEFT JOIN (SELECT * FROM `cars` ORDER BY `carPrice`) as `cars`
ON cars.belongsToUser=users.id
WHERE `id`='4'

현재 MariaDB를 사용하는 경우 서브쿼리는 제한되어야 합니다.

SELECT
    `userName`,
    `carPrice`
FROM `users`
LEFT JOIN (SELECT * FROM `cars` ORDER BY `carPrice` LIMIT 18446744073709551615) as `cars`
ON cars.belongsToUser=users.id
WHERE `id`='4'

다른 몇 가지 답변은 MAX를 사용하여 해결 방법을 제시합니다.Agregate 함수를 사용할 수 없거나 수행이 불가능한 시나리오가 있습니다.

제가 자주 사용하는 대안은 조인에서 연관된 하위 쿼리를 사용하는 것입니다.

SELECT
   `userName`,
   `carPrice`
FROM `users`
LEFT JOIN `cars`
ON cars.id = (
  SELECT id FROM `cars` WHERE BelongsToUser = users.id ORDER BY carPrice DESC LIMIT 1
)
WHERE `id`='4'

이렇게 하면 사용자가 가장 비싼 차를 얻을 수 있습니다.

SELECT users.userName, MAX(cars.carPrice)
FROM users
LEFT JOIN cars ON cars.belongsToUser=users.id
WHERE users.id=4
GROUP BY users.userName

그러나 이 문구를 보면 모든 자동차 가격을 다음과 같이 분류하고 싶어한다는 생각이 듭니다.

그래서 질문:왼쪽 조인 테이블을 carPrice로 주문하도록 설정하려면 어떻게 해야 합니까?

이 경우 다음을 시도해 보십시오.

SELECT users.userName, cars.carPrice
FROM users
LEFT JOIN cars ON cars.belongsToUser=users.id
WHERE users.id=4
GROUP BY users.userName
ORDER BY users.userName ASC, cars.carPrice DESC

이것을 시험해 보세요.

   SELECT
      `userName`,
      `carPrice`
   FROM `users`
   LEFT JOIN `cars`
   ON cars.belongsToUser=users.id
   WHERE `id`='4'
   ORDER BY `carPrice` DESC
   LIMIT 1

펠릭스

언급URL : https://stackoverflow.com/questions/5355585/how-to-sort-order-of-left-join-in-sql-query

반응형