1

次のような 2 つのテーブルがあります。

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

基本的に、url_alias テーブルには、Web サーバーがリダイレクトするエイリアス 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節です。で指定できるものはすべてwhereON で機能するので...

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

完全に受け入れられます。部分文字列操作を使用しているため、インデックスを使用できないことに注意してください。インデックスは派生データでは機能しません。データを正規化し、その「id」部分を独自のフィールドに分割する方がはるかに優れています。

于 2012-10-21T15:31:56.630 に答える