2009-06-16 151 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更改(插入,更新,删除)时运行该函数。

这允许一个相当简单的连接到物化视图,并具有索引等表的标准好处。

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