5

我有一系列包含类似格式数据的表格。即一个UNION会工作。从概念上讲,您可以将其视为 1 个表分区为多个表。我想从所有这些表中排序数据。
现在我遇到的问题是数据太多,无法一次全部显示给用户,所以我需要分部分显示它们,即页面。
现在我的问题是我需要显示已排序的数据(如前所述)。

因此,如果我执行以下操作:

SELECT FROM TABLE_1  
UNION  
SELECT FROM TABLE_2  
UNION  
....  
SELECT FROM TABLE_N
ORDER BY COL  
LIMIT OFFSET, RECORDS;  

我会不断地做一个UNIONORDER BY获得例如每个请求中相应的 50 条页面记录。

那么我将如何最有效地处理这个问题呢?

4

1 回答 1

1

我的第一次尝试是对每个表中的少量记录进行联合:

( SELECT FROM table_1 ORDER BY col LIMIT @offset, @records )
UNION  
...  
( SELECT FROM table_N ORDER BY col LIMIT @offset, @records )
ORDER BY col LIMIT @offset, @records

如果以上证明不够,我会建立一个手动索引表(基于 David Starkey 的聪明建议)。

CREATE TABLE index_table (
    table_id INT,
    item_id INT,
    col DATETIME,
    INDEX (col, table_id, id)
);

index_table然后用您喜欢的方法填充(cron 作业,表上的触发器table_n,...)。您的SELECT陈述将如下所示:

SELECT *
FROM ( SELECT * FROM index_table ORDER BY col LIMIT @offset, @records ) AS idx
LEFT JOIN table_1 ON (idx.table_id = 1 AND idx.item_id = table_1.id)
...
LEFT JOIN table_n ON (idx.table_id = n AND idx.item_id = table_n.id)

但是,我不确定这样的查询将如何使用这么多的 LEFT JOIN 执行。这实际上取决于有多少张桌子table_n

最后,我会考虑将所有表合并到一个表中。

于 2013-05-14T09:59:53.383 回答