0
items
id     | name                           | group
-----------------------------------------------------------
1      | /foo/                          | app1
2      | /foo/1                         | app1
3      | /bar/2                         | app1
4      | /foo/abc/def                   | app1
5      | /foo3/                         | app2
6      | /bar3/                         | app2


mapping
id_a | id_b 
--------------
1    | 2
3    | 4

mapping.id_a and mapping.id_b have foreign key references to item.id

gino sqlalchemy を使用して、特定の入力「名前」と「グループ」のマッピング テーブルで id_a と id_b の間に関連付けが存在するかどうかを確認する必要があります。

例:

  1. 入力 '/foo/'、'/foo/1'、'app1' の場合 --> 一致成功。
  2. 入力 '/bar/2'、'/foo/abc/def'、'app1' の場合 --> 一致成功。
  3. 入力 '/foo3/'、'/bar3/'、'app2' の場合 --> 一致は失敗します。
4

1 に答える 1

0

それは結合で簡単です:

SELECT TRUE
FROM items AS i1
   JOIN mapping AS m ON i1.id = m.id_a
   JOIN items AS i2 ON m.id_b = i2.id
WHERE i1.name = '/foo/'
  AND i2.name = '/foo/1' AND i2.group = 'app1';

これが行を返す場合、一致があります。

良好なパフォーマンスを得るには、次の 2 つのインデックスを作成します (まだ存在しない場合)。

CREATE INDEX ON item (name, group);
CREATE INDEX ON mapping (id_b);

次に、効率的なネストされたループ結合を取得する必要があります。

于 2021-01-22T11:35:59.447 に答える