2012-06-19 3 views
3

나는 데이터의 세 개의 테이블이 있습니다세 개의 데이터 테이블을 페이징?

table: cars [10,000 rows] 
table: planes [2,000 rows] 
table: trains [50 rows] 
나는 사용자에게 같은 세 개의 테이블에서 가져온 데이터의 페이지를 표시 할 수 있도록하고 싶습니다

:

car 
plane 
train 
car 
plane 
train 
... 

요점은 그들이 할 수 있다는 것을 각 테이블이 다 소모 될 때까지 각 유형 중 하나를보고 페이징을 유지합니다. 예를 들어 어느 시점에서 각 페이지는 자동차 테이블을 포함하기 전에 비행기와 열차 테이블이 소진 될 때만 차량을 포함합니다.

한도에 도달 할 때까지 각 테이블에서 한 행을 가져올 수있는 쿼리가 있습니까? 그리고 내가 할 수있는

id | type | description | dummy_integer 
-------------------------------------------- 
... car  ...    0 
... plane ...    1 
... train ...    2 
... car  ...    3 
... plane ...    4 
... train ...    5 
... ...  ...    ... 
... car  ...    8000 
... car  ...    8001 
... car  ...    8002 
... ...  ...    ... 

: 뭔가 같은 : 내가 그들을 삽입으로

SELECT * FROM cars, planes, trains ORDER BY (natural row ordering?) LIMIT 20; 

나는이 작업이 완료 얻을 생각할 수있는 유일한 방법은 하나 개의 마스터 테이블을 만들고, 각 행에 더미 정수를 할당하는 것입니다

SELECT * FROM master_table ORDER BY dummy_integer ASC LIMIT 20; 

및 페이징은 마지막에서 볼 dummy_integer 사용하여 수행됩니다 : 할

SELECT * FROM master_table WHERE dummy_integer > 20 
    ORDER BY dummy_integer ASC LIMIT 20; 

예를 들어 새로운 열차 레코드를 얻을 때 master_table의 끝 부분에 추가 할 수 있지만 더미 정수 값을 사용하면 끝까지 줄 수 있습니다. 따라서 사용자가 처음부터 내 페이지를보고 시작하면 전방으로 차량/비행기를 멋지게 삽입하는 대신 자동차 사막을 통과 할 때까지 새로운 열차 데이터를 볼 수 없습니다.

위의 (좋지 않은) 방법 외에이 작업을 수행하는 좋은 방법이 있습니까?

감사합니다.

+0

세 개의 서로 다른 유니폼 쿼리를 수행하는 것이 트릭보다 빠를 가능성이 높습니다. 프로필을 만드는지 확인하십시오. –

답변

1

쉼표가 실제로 조인을 수행하지 않습니까?

가 나는 UNIONORDER BY가를 달성하기 위해 사용하십시오 : 페이지 매기기에

SELECT id, type, description FROM cars 
UNION 
SELECT id, type, description FROM planes 
UNION 
SELECT id, type, description FROM trains 
ORDER BY id, type 

(working example)

, 당신은 OFFSETLIMIT을 (docs 참조)를 사용할 수 있습니다. 나는 당신의 열 이름을 변경하지 않은

select 
    1 as typer, 
    a.id, 
    a.type, 
    a.description, 
    row_number() over (partition by typer order by typer) as ranker 
from 
    cars a 
union 
select 
    1 as typer, 
    a.id, 
    a.type, 
    a.description, 
    row_number() over (partition by typer order by typer) as ranker 
from 
    planes a 
union 
select 
    1 as typer, 
    a.id, 
    a.type, 
    a.description, 
    row_number() over (partition by typer order by typer) as ranker 
from 
    trains a 
order by 
    ranker asc; 

,하지만 당신은 아마 최고의 일부 예약 된 단어를 사용하고 있습니다 : Oracle을 사용하는 경우

+0

그게 내가 찾고 있던 것 뿐이야, 고마워. – user291701

0

이 당신을 위해 작동합니다.

관련 문제