1

我有两个看起来像这样的表:

node:
NID    Name
1      Chicago
2      New York
3      LA

url_alias:
src    dst
user/1    user/Bob
user/2    user/Mike
node/1    node/chicago
node/2    node/new-york
node/3    node/LA

ETC

基本上, url_alias 表有我的网络服务器重定向到的别名 url。如 url 中所示,节点和用户都有“id”。我正在尝试将我的节点表连接到 url_alias 表并匹配“/”(节点 ID)之后的内容。到目前为止,我有这段代码,但它只使用子字符串而不是像这样它也匹配任何以正确数字结尾的用户:

select `node`.`nid` AS `nid`,`node`.`name` AS `name`,`url_alias`.`src` AS `srcurl`,`url_alias`.`dst` AS `dsturl`
from ((`node` join `url_alias` on ((`node`.`nid` = substring(`url_alias`.`src`,6)))))
order by `node`.`nid` desc

(实际上查询有点长,因为它还加入了另一个正在工作的表,但为简单起见,我对其进行了编辑)

此查询返回如下结果:

nid    name      srcurl    dsturl

1      chicago   node/1    node/chicago
1      chicago   user/1    user/Bob
2      new-york   node/1    node/new-york
2      new-york   user/1    user/Mike

有没有办法在我的查询中使用“LIKE 'node/%'”,或者类似于在子字符串运行匹配之前只抓取“节点”?

4

1 回答 1

2

连接的on部分本质上只是一个where子句。您可以在 a 中指定的任何内容都where将在 ON 中起作用,所以...

JOIN x ON somefield LIKE 'node%' AND node.nid = SUBSTRING(src, 6)

完全可以接受。请注意,由于您使用的是子字符串操作,因此无法使用索引 - 索引不适用于派生数据。规范化数据并将“id”部分拆分到自己的字段中会好得多。

于 2012-10-21T15:31:56.630 回答