私は、ユーザーが演算子&|を使用してタグの文字列を入力できるタグベースの検索を実装しようとしています。と !検索語をグループ化する機能[すなわち(X&Y)|!Z]とともに。私の計画は、そこにある短い文字列を、特定のタグにリンクされているオブジェクトを検索する可能性のある完全なSQLクエリに変換できるようにすることです。
object >--< tags
object -< bond >- tags
----------- ----------------------- ------
| object | | bond | | tag |
----------- ---- -------- --------- ------
| Id | Name | | Id | textId | tagName | | Name |
---- ------ ---- -------- --------- ------
| 1 | A | | 1 | 1 | V | | V |
| 2 | B | | 2 | 1 | W | | W |
| 3 | C | | 3 | 1 | X | | X |
---- ------ | 4 | 2 | Z | | Y |
| 5 | 3 | V | | Z |
| 6 | 3 | W | ------
| 7 | 3 | X |
| 8 | 3 | Y |
---- -------- ---------
SEARCH:
(X&Y)|Z
QUERY:{
SELECT *
FROM object
WHERE object.id = bond.textId
AND (
(bond.tagName = 'X' AND bond.tagName = 'Y')
OR bond.tagName = 'Z'
)
RETURN:
2 | B
3 | C
クエリをコンパイルするために次のように記述しました http://jsfiddle.net/wP7JR/1/
そして、私のクエリをテストするために以下 http://sqlfiddle.com/#!2/139ca/3/0
しかし、私はいくつかの問題に気づき、ガイダンスを探しています。
何よりもまず、私はこの問題、この問題の解決策などを議論するリソースを検索して探してきました。しかし、私の最大の問題は、最良の検索が何であるかわからないことです...このタイプの問題には名前があると確信しています。常にあります。
次に、tagName <>'Y'を検索すると、オブジェクト1と2を返したいのですが、オブジェクト3がYにリンクされていない結合があるため、代わりに1、2、3を受け取ります。
(tagName ='X'&tagName ='Y')を検索しても何も返されません。これは、タグXとYが同時にリンクされているオブジェクトが発生しないためです。
それで、今後、私は自分の問題を解決するための少しのガイダンスを探しています。
同様の問題、解決策(?)、代替解決策(?私のものがこの問題を解決する最適な方法ではない場合)を検索することを考えています。
ありがとう