我有以下表格
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
这些是表的片段,并且缺少其余的数据(它们都非常大),但我尝试将第二个表中的dst列加入到第一个表中。它们应匹配“nid”,但第二个表有节点/ [nid],这使得它更复杂。我也想忽略以“feed”结尾的那些,因为我不需要它们。
非常感谢
编辑:我没有提到这个感觉很糟糕,但第一个表是来自的sql结果select nid, MAX(timestamp) as timestamp, title from node_revisions group by nid ORDER BY timestamp DESC LIMIT 0,5
第二个表的名称为“url_alias”
答案 0 :(得分:5)
试
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
答案 1 :(得分:0)
我不知道您使用的数据库。但是,我建议你编写一个解析函数,从该列返回nid。然后,您可以进行此类查询(假设GET_NID是您定义的函数):
SELECT * from T1, T2
WHERE T1.nid = GET_NID( T2.node)
答案 2 :(得分:0)
您有几个选择。
编写一个将src转换为nid并在t1.nid = f(t2.src)上连接的函数 - 您没有说出您使用的DBMS,但大多数都有办法做到这一点。它会很慢,但这取决于表的大小。
与此类似,使用该函数创建一个具有计算字段的视图 - 速度相同,但可能更容易理解。
在t2中创建一个新的nid字段并使用该函数填充它。制作插入和更新触发器以使其保持最新,然后加入。如果您经常查询,这会更好。
转换t2以使其具有nid字段并从中计算src以及另一个字段,该字段是nid需要插入的模板。
答案 3 :(得分:0)
SELECT * FROM (SELECT *, 'node/' + nid AS src FROM table1) t1 INNER JOIN table2 t2 ON t1.src = t2.src
答案 4 :(得分:0)
我将第二个表中的节点id拉入一个单独的列。否则,任何加入这两个表的尝试都会导致在src字段上进行一些表处理(我假设你的意思是src字段而不是dst字段)并且性能会有问题。
答案 5 :(得分:0)
根据您想要的场景(例如,如果您经常要执行此JOIN并且您的第二个表格相当大),您可能需要查看物化视图。
编写一个函数,执行所有逻辑以将nid提取到单独的列中。除了初始的m-view创建之外,该函数只需要在basetable更改(插入,更新,删除)时运行,而不是每次查询时对每行运行函数。
这允许对物化视图进行相当简单的连接,并具有表格的标准优势,例如索引。
注意:看起来我在写作时遭到了殴打:)
答案 6 :(得分:0)
您还没有使用DBMS指定。大多数引擎都支持使用正则表达式进行匹配的SQL-99标准SIMILAR TO子句。一些引擎也实现了这一点,但使用其他一些关键字而不是SIMILAR TO。
FirebirdSQL:
http://wiki.firebirdsql.org/wiki/index.php?page=SIMILAR+TO
的PostgreSQL:
http://www.network-theory.co.uk/docs/postgresql/vol1/SIMILARTORegularExpressions.html