2017-11-14 5 views
-1

내 mySQL (말장난 의도)은 녹슬지 않습니다. 다른 테이블을 통해 테이블에 가입하려고합니다. 테이블을 통해 조인 된 테이블을 기준으로 정렬

carparks has many clients 
clients has many cars 

쿼리

select `carparks`.* from `carparks` 

left join `clients` on `carparks`.`carpark_id` = `clients`.`carpark_id` 

left join `cars` on `clients`.`client_id` = `cars`.`client_id` 

where `carparks`.`carpark_id` in (1, 3, 8, 33, 34, 38, 39) 

order by `cars`.`created_at` desc 

에게 당신이 내가 자동차의 created_at 열, 반환 주차장 내에서 자동차의 각 주차장 목록을 중복 불구하고 위의 쿼리에 의해 주문하는 것을 시도하고있다 볼 수 있듯이.

내가보고있는 것은 자동차 테이블의 created_at 열에 의해 간단히 정렬 된 WHERE IN 절에있는 ID를 사용하여 해당 주차장을 반환하는 것입니다.

감사

+0

add GROUP BY 절 –

+1

요구 사항이 잘못 정의되었습니다. 주차장에는 많은 차량이있을 수 있습니다. A에 2016 년에 만든 자동차가 있고 B에 2 대의 자동차가 있다고 가정합니다. 하나는 2015 년에 만들어졌고 2017 년에는 하나입니다. 어느 것이 먼저 오게됩니까? – Mureinik

+0

@Mureinik Carpark B는 가장 최근의 created_at 타임 스탬프를 가지고 있기 때문에 처음으로 올 것입니다. – 0plus1

답변

4

당신은 최대의 조항에 의해 주문에 집계를 사용할 수는하는 주차장에 다시 합류하기 전에 주차장 당 하나에 원하는 날짜를 줄이고 자동차 테이블

SELECT cp.* 
FROM `carparks` cp 
LEFT JOIN `clients` cl ON cp.`carpark_id` = cl.`carpark_id` 
LEFT JOIN `cars` c ON cl.`client_id` = c.`client_id` 
WHERE cp.`carpark_id` IN (1, 3, 8, 33, 34, 38, 39) 
GROUP BY cp.`carpark_id` 
ORDER BY MAX(c.`created_at`) DESC 
+0

이 점에 대해 감사드립니다. MAX 사용에 대해서는 생각하지 않았습니다. 성능에 영향이 있습니까? – 0plus1

+1

@ 0plus1 더 나은 성능 아이디어를 위해 EXPLAIN 플랜을 최대 주문 및 최대 주문으로 주문할 수 있습니다. –

0

에서 날짜를 만들었습니다. 왼쪽 조인이 논리적 인 것보다 주차장을 가지고 있지 않다는 것에 유의하십시오. 그러나 모든 주차장 (사업을 위해 열려있는)에는 자동차가있을 것이므로 왼쪽 조인은 필요하지 않을 것입니다.

SELECT `carparks`.* 
FROM `carparks` 
LEFT JOIN (
     SELECT 
       `carparks`.`carpark_id` 
      , max(`cars`.`created_at`) max_car_created 
     FROM `clients` 
     INNER JOIN `cars` ON `clients`.`client_id` = `cars`.`client_id` 
     GROUP BY 
       `carparks`.`carpark_id` 
     ) d ON `carparks`.`carpark_id` = d.`carpark_id` 
WHERE `carparks`.`carpark_id` IN (1, 3, 8, 33, 34, 38, 39) 
ORDER BY max_car_created DESC 
0

조인을 수행하기 전에 주차장과 클라이언트의 수를 줄이면 쿼리 실행 시간이 단축됩니다.

SELECT A.* FROM (SELECT * FROM `carparks` WHERE `carpark_id` in 
(1, 3, 8, 33, 34, 38, 39)) A LEFT JOIN 
(SELECT `carpark_id`, `client_id` FROM `clients` WHERE `carpark_id` 
in (1, 3, 8, 33, 34, 38, 39)) B ON A.`carpark_id`=B.`carpark_id` LEFT JOIN 
`cars` C ON B.`client_id` = C.`client_id` 
GROUP BY A.`carpark_id` 
ORDER BY MAX(C.`created_at`) DESC 
관련 문제