2014-07-12 3 views
1

groupBy의 "group"부분에서 요소를 선택하는 가장 좋은 방법은 무엇입니까? ([key -> group] 관계가되는 groupBy). 가능한 경우 하나의 db 히트 또는 적어도 일정한 히트가 발생해야합니다.Slick : groupBy "group"에서 요소 가져 오기

예를 들어 Locations (id) 및 Companies (id, locationId, foundedDate) 테이블이 있다고 가정 해 보겠습니다. 각 지역에서 가장 오래된 회사를 어떻게 찾을 수 있습니까?

나는 이런 식으로했을

:

Locations.join(Companies).on(_.id === _.locationId).groupBy(_._1).flatMap { 
    case (location, companies) => 
    companies.map(_._2).sortBy(_.foundedDate).take(1).map { 
     company => (location, company) 
    } 
} 

을하지만이 런타임 예외가 생성

scala.slick.SlickException: Unsupported query shape containing .groupBy without subsequent .map 
at scala.slick.compiler.FuseComprehensions.fuse(Relational.scala:200) 
... 

답변

0

슬릭 당신이 쓰기도하는 경우, 이러한 쿼리를위한 최적의 코드를 생성되지 않습니다 예를 들어 MySQL은 무거울 수 있습니다 (동일한 날짜에 설립 된 같은 위치에 여러 회사가있는 경우 잠재적으로 모호합니다). 따라서 단순한 솔루션은 회사를 위치별로 그룹화하고 데이터베이스 외부에서 날짜순으로 정렬 한 다음 위치와 일치시키는 것입니다.

val locations = Locations.list.map(location => (l.id,location)).asMap 

val lcPairs = Companies.list 
        .group(_.locationId) 
        .map{ case (locationId, companies) => (
         locations(id),companies.sort(_.foundedDate).head 
        )} 
1

저는 Scala 또는 Slick에 익숙하지 않지만 SQL을 후드에서 사용하는 경우에는 작동하지 않습니다. 대부분의 구현에서 쿼리에 의해 반환 된 요소는 범주 값 (이 경우 위치 및 회사) 또는 집계 함수 중 하나 여야합니다.

이 작동 할 수 있습니다 ...

SELECT location.id, company.id, MAX(foundedDate) 
FROM companies INNER JOIN locations ON (locations.id = companies.locationId) 
GROUP BY location.id, company.id 
ORDER BY location.id, MAX(foundedDate) 

...하지만 없음 그룹과 정렬을하고 동일한 기능입니다 : 필터링 할 필요없이

SELECT location.id, company.id, foundedDate 
FROM companies INNER JOIN locations ON (locations.id = companies.locationId) 
ORDER BY location.id, foundedDate 

가장 오래된 회사를 찾는 방법 그 결과, 상관 하위 쿼리를 사용할 수 있습니다 :

SELECT location.id, company.id, foundedDate 
FROM companies INNER JOIN locations ON (locations.id = companies.locationId) 
WHERE foundedDate = (SELECT MAX(foundedDate from companies c2 where c2.locationId = location.id) 

이렇게하면 여러 회사를 반환 할 수 있습니다. b y 위치에 있는지 확인하십시오.

어떻게 스칼라/슬릭으로 돌아가는지는 말할 수 없지만, 조금 도움이 되었기를 바랍니다.

+0

의도는 있지만 추가 정보는 질문에 대답하지 않습니다. 질문에 대한 의견으로 더 적합 할 것입니다. –