2010-05-11 36 views
1

我有兩個表在不同的服務器上,我想幫助找到一種有效的方法來組合和匹配數據集。這裏有一個例子:有效的方法來結合兩個數據庫查詢的結果

從服務器1,持有我們的故事,我執行類似的查詢:

query = """SELECT author_id, title, text 
      FROM stories 
      ORDER BY timestamp_created DESC 
      LIMIT 10 
      """ 
results = DB.getAll(query) 

for i in range(len(results)): 
    #Build a string of author_ids, e.g. '1314,4134,2624,2342' 

不過,我想從服務器2獲取有關每個AUTHOR_ID一些信息:

query = """SELECT id, avatar_url 
      FROM members 
      WHERE id IN (%s) 
      """ 
values = (uid_list) 
results = DB.getAll(query, values) 

現在我需要一些方法來結合這兩個查詢,所以我有一個字典,有avatar_url和member_id的故事。

如果此數據是一臺服務器上,這將是一個簡單的加入,將是這樣的:

SELECT * 
FROM members, stories 
WHERE members.id = stories.author_id 

但由於我們的數據存儲在多個服務器上,這是不可能的。

什麼是最有效的方法來做到這一點?我知道合併可能必須在我的應用程序代碼中發生......任何有效的示例代碼可以最大限度地減少dict循環的數量,我們將不勝感激!

謝謝。

回答

2

如果內存不是問題,可以使用字典。

results1_dict = dict((row[0], list(row[1:])) for row in results1) 
results2_dict = dict((row[0], list(row[1:])) for row in results2) 

for key, value in results2_dict: 
    if key in results1_dict: 
     results1_dict[key].extend(value) 
    else: 
     results1_dict[key] = value 

這不是特別有效(N ),但它是相對簡單的,你可以調整它做的正是你所需要的。

0

您必須以某種方式將數據集中在一起。

  • 有一些像服務器鏈接(儘管這可能不是在mysql上下文中正確的術語),可能允許查詢跨不同的數據庫。這會產生另一組問題(安全!)

  • 更簡單的解決方案是將數據放在一個數據庫中。

  • 最後一個(最不可取的)解決方案是按照Padmarag的建議加入代碼。

0

唯一的選擇看起來是數據庫鏈接,但不幸在MySQL中不可用。
您必須在應用程序代碼中進行合併。最好將數據保存在同一個數據庫中。

+0

嗨 - 我同意,我必須在我的應用程序代碼中執行此操作。我正在尋找在我的應用程序中最有效的方式。任何示例代碼將不勝感激。 – ensnare 2010-05-11 05:21:29

+0

在您的代碼中執行此操作意味着您需要通過將組合數據寫入第三個數據結構(例如字典)來比較結果集條目。這是非常具體的領域,你主要靠你自己擔心。 – lexu 2010-05-11 05:29:37

0

是否可以將所需表格從一臺服務器複製到另一臺服務器上的數據庫? 這樣你就可以將所有的數據放在一臺服務器上。

另外,請參閱FEDERATED存儲引擎,可用於mysql 5.0.3。

相關問題