SQL은

2017-01-18 2 views
0

지금 나는이 개 질문이 한 쿼리에서 키 전에 최소한 n 요소를 얻을.SQL은

  • 첫 번째 쿼리는 한도가 n 인 첫 번째 쿼리를 실행합니다.
  • 그런 다음 얼마나 많은 결과를 받았는지 results.count()을 확인합니다.
  • 그런 다음 나머지 키가 두 번째 쿼리 인 경우 let remaining = n - result.count() (필요한 경우)을 수행합니다 (remaining > 0).

하나의 쿼리에서이 작업을 수행 할 수 있습니까?

예 :

1. a 
2. b 
3. c 
4. d 

get(key = 'a', limit = 2) would return a, b 
get(key = 'c', limit = 2) would return a, b 
get(key = 'd', limit = 2) would return b, c 
get(key = 'd', limit = 3) would return a, b, c 
+0

첫 번째 쿼리 나던 어떤 필드를 선택하거나'*'를 그리워? –

+0

@JuanCarlosOropeza fixed -> yeah 나는 그것을 놓쳤다. 그러나 Orientdb에서 이것은 유효한 쿼리 다. 그래서 그것이 그것을 잊어 버린 것이다. 그것은 정규화되지 않은 것으로 간주 될 관계형 데이터베이스에서도 사용 권한을 설명합니다. –

+0

당신은 손안에'n'을 압니까? 또는'result.count'에 의해 계산됩니까? –

답변

2

당신은 잘못된 질문을하는 페이징 필요합니다.

orient db에 익숙하지 않은 경우에도 현재 질문에 답하십시오.

select * 
from table 
where login < ? 
order by login DESC 
limit n 

UNION ALL 

select * 
from table 
where login >= ? 
order by login 
limit n    -- worst case scenerio all n logins are equal or beyound ? 

는 그 하위 쿼리를 통해 선택을 수행

당신은 UNION 모두 querys이 필요합니다.

SELECT * 
FROM (...) as union_query 
ORDER BY login 
limit n 
+0

정확히 첫 번째 쿼리이며, 키 앞에 충분한 레코드가 있고 완전히 usecase에 맞지 않으면 작동합니다. 예를 들어 키 앞에 3 개의 레코드가 있고 5 개의 레코드를 받고 싶다면 키 뒤에 나머지 두 개의 레코드를 가져옵니다. –

+0

나는 당신의 질문에서 그것을 보지 않았다. 그것이 좋은 본보기가 필요한 이유입니다. –

+0

제 편집을 확인하십시오.나는 동양에 어떻게 sintaxis가 될지 모르기 때문에 그것을 구분했다. 하지만 먼저 조합을 테스트 한 다음 해당 하위 쿼리를 선택하십시오. –

1

귀하가 찾고 계신 것은 귀하의 기록 순위입니다. 귀하는 키 이전에 기록을 선호합니다. 따라서 키의 레코드가 차선책으로 간주됩니다. 그런 다음 키에 가능한 한 일정량의 행만 필요합니다. 가능한 순위는 키에 따라 행 번호가되지만 주어진 키 앞에 -1로 곱해집니다. 예 : 키 d를 찾을 때 :

 
key rn 
a -1 
b -2 
c -3 
d +4 
e +5 

순위로 정렬 :

 
key rn 
c -3 
b -2 
a -1 
d +4 
e +5 

그래서 당신이 얻을 것 c를 먼저 한 후 다음, 다음 D, 다음, E, B. 내가 OrientDB를 모르는

, 그래서 여기에 표준 SQL이다 :

select login, permissions 
from 
(
    select 
    login, 
    permissions, 
    case when login < :value then 
     -row_number() over (order by login) 
    else 
     row_number() over (order by login) 
    end as rn 
    from user 
) 
order by rn 
fetch first :n rows only; 
+0

이것은 아마도 작동하지만 테이블의 전체 검사를 다시 수행하므로 아주 큰 테이블이라면 그리 효율적이지는 않습니다. 또한 마지막에 로그인하여 주문해야합니다. OP는 pagging 기능을 원하므로 'a'가 먼저 있어야하고 'c'가 없어야합니다. –