2009-06-16 155 views
1

我有以下表SQL連接問題

nid timestamp title 

82 1245157883 Home 
61 1245100302 Minutes 
132 1245097268 Sample Form 
95 1245096985 Goals & Objectives 
99 1245096952 Members 

 pid  src   dst          language 



     70 node/82   department/34-section-2  
     45 node/61/feed department/22-section-2/feed  
     26 node/15   department/department1/15-department1  
     303 node/101  department/101-section-4 

這些表的片段,以及缺少數據的其餘部分(它們都是相當大),但我正在嘗試將第二個表中的第d列加入第一個表中。他們應該匹配他們的「nid」,但第二個表有node/[nid],這使得這更加複雜。我也想忽略那些以「飼料」結尾的飼料,因爲它們不是我所需要的。

很大程度上得益於

編輯:我覺得不好沒有提及這一點,但第一個表是從

select nid, MAX(timestamp) as timestamp, title from node_revisions group by nid ORDER BY timestamp DESC LIMIT 0,5 

第二個表的名稱爲「url_alias」

+3

BTW發佈關於SQL的問題時,你應該張貼您正在使用的DBMS因爲它可以產生巨大的差異 – 2009-06-16 13:41:29

回答

5

嘗試的SQL結果

select * from table1 inner join table2 on src=concat('node/',nid) 

編輯
編輯,以反映變化中的OP

select `nid`, MAX(`timestamp`) as `timestamp`, `title` from `node_revisions` inner join `url_alias` on `src`=concat('node/',`nid`) group by `nid` ORDER BY `timestamp` DESC LIMIT 0,5 
+0

第二個記錄表將不會與連接規則匹配... – 2009-06-16 13:42:19

0

我不知道你用的是什麼數據庫。不過,我建議你編寫一個解析函數,從該列返回nid。然後,您可以進行這種查詢(假設GET_NID是您定義的函數):

SELECT * from T1, T2 
WHERE T1.nid = GET_NID(T2.node) 
0

您有幾個選項。

  1. 編寫轉換SRC到一個nid功能和加入t1.nid = F(t2.src) - 你沒有說你用什麼數據庫管理系統,但最有辦法做到這一點。它會很慢,但這取決於表格的大小。

  2. 與此類似,使視圖具有使用該函數的計算字段 - 相同的速度,但可能更容易理解。

  3. 在t2中創建一個新的nid字段並使用該函數來填充它。使插入和更新觸發器保持最新,然後加入。如果你經常查詢,這會更好。

  4. 將t2轉換爲具有nid字段並根據該字段計算src,並將另一個字段作爲nid需要插入的模板。

0
 
SELECT * 
FROM (SELECT *, 'node/' + nid AS src FROM table1) t1 
INNER JOIN table2 t2 
ON t1.src = t2.src 
0

我拉在第二表中的節點ID到一個單獨的列中。否則,任何嘗試加入這兩個表都會導致在src字段中進行一些表掃描(我假設你指的是src字段而不是dst字段),並且性能會有問題。

0

根據你想要的這種情況(例如,如果你經常要執行這個JOIN,而你的第二個表格比較大),你可能需要查看物化視圖。

編寫一個函數,執行所有邏輯以將nid提取到單獨的列中。除了初始的m-view創建之外,與每次查詢時針對每一行運行該函數相比,只需在Basetable更改(插入,更新,刪除)時運行該函數。

這允許一個相當簡單的連接到物化視圖,並具有索引等表的標準好處。

注:貌似我被打它而寫:)