1

管理チェーンを格納するために具体化されたパスを使用しているとしましょう:

  Table: User
  id           name             management_chain
  1            Senior VP        {1}
  2            Middle Manager   {1,2}
  3            Cubicle Slave    {1,2,3}
  4            Janitor          {1,2,4}

すべての直属の部下を返すユーザー ID を指定してクエリを作成するにはどうすればよいですか。別の言い方をすれば、management_chain最後から 2 番目の位置で照会された ID を含むすべてのレコードを取得する良い方法は何でしょうか (最後の項目がユーザー自身の ID を表す場合)。

つまり、次の SQL をどのように表現すればよいでしょうか。

SELECT *
FROM USER u 
WHERE u.management_chain @> {stored_variable, u.id}

私の現在のJS:

 var collection = Users.forge()
    .query('where', 'management_chain', '@>', [req.user.id, id]);

どのエラーが発生しますか

ReferenceError: id is not defined

4

2 に答える 2

1

management_chainが整数配列( )であると仮定するとint[]、次のことができます(プレーンSQLで)

select *
from (
  select id,
         name,
         '/'||array_to_string(management_chain, '/') as path
  from users
) t
where path like '%/2/%';

array_to_string()文字列の末尾に区切り文字を追加しないため、これは機能します。したがって、パスにシーケンスが含まれている場合は、その/2/「下」にさらにノードがあることを意味します。2の最後の ID であるノードは(末尾の なし) でmanagement_chain終わり、結果には含まれません。/2/

式はインデックスを使用しないため、これは大きなテーブルには適していない可能性があります。

ただし、これがどのようにJSに変換されるかはわかりません。

SQLFiddle の例: http://sqlfiddle.com/#!15/75948/2

于 2014-10-24T20:36:19.160 に答える