2015-12-30 29 views
1

但願這不是太主觀,但:如何合併和顯示數據從多個表

我有,我需要查詢從基於ID四種不同的表中的數據有問題。該數據具有相似但不相同的字段,需要爲每個表格顯示。本質上,如果我有表A,B,C,和d,則對於一個id N,I可能需要以下面的順序來顯示的行:

A1 

B1 
B2 
B3 

C1 

D1 
D2 
D3 
D4 

然而,由於某些B和d的要求我加入許多表,並且我有成千上萬的記錄,我不想爲每個ID發送四個複雜的查詢。我正在預先構建數據 - 創建一個臨時表,其中包含每個最終的A,B,C,D數據,然後通過ID直接查詢這些行。有更快的方法嗎?我想過使用UNION,但我的行並不都具有相同種類的列(對於A類行,我可能需要顯示一個日期,而C類行將有一個整數日偏移量)。

我目前的做法:

foreach ($ids as $id) { 
    $a = "SELECT * FROM a JOIN xyz (...) WHERE id = ?"; 
    $b = "SELECT * FROM b JOIN xyz (...) WHERE id = ?"; 
    $c = "SELECT * FROM c JOIN xyz (...) WHERE id = ?"; 
    $d = "SELECT * FROM d JOIN xyz (...) WHERE id = ?"; 

    print query($a, $id)->fetch(); 
    print query($b, $id)->fetchAll(); 
    print query($c, $id)->fetch(); 
    print query($d, $id)->fetchAll(); 
} 

或者類似的東西

+1

在代碼中顯示您的方法。另外,你使用哪個DBMS?我懷疑你有'mysql'' sql-server'和'postgresql'問題,同時解決了這個問題 –

+0

固定。我使用postgres,但特定的DBMS與方法無關。 – grobolom

+0

如果我理解正確,你可以查看'FULL JOIN',或者用'UNION'和'NULL'值查找你沒有列的查詢 –

回答

1

首先,我絕對不會查詢數據庫的4倍。我試圖只查詢一次數據庫,即使它需要討厭的和長的sql代碼,以減少服務器和數據庫之間的往返行程。

就像評論中的「考慮我」和「戈登裏諾夫」一樣,我將創建一個包含所有表中的所有字段的單個查詢,並將它們全部聯合起來。對於某些表格專用的字段,我會在爲其他表格的查詢中聲明它們時放置'null'。

例如:

select t.description as 'Description', null as 'Value' 
from A t 
UNION 
select null as 'Description', t.value as 'Value' 
from B t 

您也可以返回所有表的所有領域和前綴每個返回現場,所以你會知道從哪個表它起源。

例如:

select t.description as 'A_Description' 
from A t 
UNION 
select t.value as 'B_Value' 
from B t 

爲了簡單,安全性和效率,我會把整個SQL代碼返回,你可以從服務器端代碼作爲記錄解釋的表用戶定義的函數內。該函數將ID作爲參數。這也可以以視圖的形式實現。

爲了提高效率,我會在表中用於連接的每個字段上放置索引,這應該大大縮短查詢時間。

一般來說,我也會試着找出在一天/小時/分鐘/秒內調用這個函數的次數。 如果經常需要該函數提供的數據,那麼可能需要採用完全不同的方法 - 重新整理整個數據庫。但是,如果數據是靜態或半靜態的,那麼緩存機制就足夠了 - 以另一個數據庫表,服務器端靜態對象或甚至客戶端靜態對象的形式存在。

對於您的問題沒有一個簡單的答案,因爲有多個因素需要考慮。

+0

謝謝,我會凝聚成一個單一的查詢。我的另一個擔心是以正確的方式交錯數據,但我想我可以用ORDER BY來做到這一點。 – grobolom

相關問題