2013-05-13 21 views
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個頁面記錄。

那麼,如何最有效地處理這個問題呢?

+0

你可以選擇數據INTO臨時表,然後添加一個頁碼或什麼的列? – 2013-05-13 19:29:51

+0

@DavidStarkey:那麼創建一個類似於查找表的東西? – Cratylus 2013-05-13 19:31:40

+0

基本上,是的。 – 2013-05-13 19:32:54

回答

1

我第一次嘗試將UNION'ing只是從每個表中的記錄數量少:

(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 

如果上述證明不足,我將建立一個手動索引表(根據大衛·斯塔基的聰明建議) 。

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

最後,我會考慮將所有表合併成一個表。

+0

你有任何想法是否有意義使用sphinx/solr/elasticsearch?在我的情況下,將表合併爲一個不是一個選項(表格很大,結構也不相同),因爲數據每十秒(或更頻繁)更新一次,因此也會創建臨時表。聽到你的意見只是有趣 – Tebe 2016-03-03 07:43:40

+0

我想它是有道理的,但我不能建議。考慮將其作爲一個問題,並將其與上下文關聯起來。 – RandomSeed 2016-03-03 09:32:38

相關問題