3

我有三个数据表:

table: cars    [10,000 rows]
table: planes  [2,000 rows]
table: trains  [50 rows]

我希望能够向用户展示从三个表中获取的数据页面,例如:

car
plane
train
car
plane
train
...

关键是他们可以继续分页,查看每种类型的一种,直到每个表都用完为止。例如,在某些时候,每个页面将只包含汽车,因为飞机和火车表将在汽车表之前用完。

是否可以运行查询以从每个表中获取一行,直到达到限制?就像是:

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

我认为完成此操作的唯一方法是制作一个主表,并在我插入它们时为每一行分配一个虚拟整数:

  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 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 的末尾,但是它们的虚拟整数值会将它们一直放在最后。因此,如果用户从一开始就开始查看我的页面,他们将不会看到更新的火车数据,直到他们翻阅汽车沙漠,而不是与前面的汽车/飞机很好地交错。

除了上述(不太好)的方法之外,还有什么好的方法吗?

谢谢

4

2 回答 2

1

您的查询中的逗号实际上不是在执行联接吗?

我会使用UNIONandORDER 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

工作示例

对于分页,您可以使用LIMITwith OFFSET(请参阅文档)。

于 2012-06-19T04:37:57.183 回答
0

如果您使用的是 oracle,这将适用于您:

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;

我没有更改您的列名,但您使用了一些保留字,可能不是最好的。

于 2012-06-19T05:05:53.443 回答