私は言わなければならない-私は困惑している。近づいても解決策は思いつかない。私はこれらの方向で解決策を探してみます:
- ユーザー定義の集計関数。たぶん、引数として目的の式(簡略化された構文)と1人の人の行を受け取る関数を作成できます。次に、関数は式を解析し、それを行と照合します。うーん...多分MySQLにはいくつかの連結集計関数と正規表現マッチング関数が含まれていますか?その場合、これは解決策になる可能性があります(ただし、おそらくそれほど高速ではありません)。
- 分析機能。私はそれらを理解しているふりをしませんが、私がそれらについて知っている限り、それらは一般的にこの方向にあると思います。このニーズに合った機能があるかどうかはわかりませんが。
追加: ああ、わかったと思います!パフォーマンスは悲惨になると思いますが。しかし、これはうまくいきます!たとえば、1 AND 2 AND (3 OR 4)
を検索する必要がある場合 次に、次のように記述します:
SELECT
*
FROM
Persons A
WHERE
EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=1)
AND
EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=2)
AND
(
EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=3)
OR
EXISTS (Select * from PersonCriteria B WHERE A.PersonID=B.PersonID AND CriteriaID=4)
)
2を追加: もう1つありますが、パフォーマンスはさらに悪化する可能性があります。
SELECT p.* FROM Person p
JOIN (select PersonID from PersonCriteria WHERE CriteriaID=1) c1 ON p.PersonID=c1.PersonID
JOIN (select PersonID from PersonCriteria WHERE CriteriaID=2) c2 ON p.PersonID=c2.PersonID
JOIN (select PersonID from PersonCriteria WHERE CriteriaID IN (3,4)) c3 ON p.PersonID=c3.PersonID
3を追加: これはNo.2のバリエーションですが、実際にはまともなパフォーマンスの可能性があります!
SELECT p.* FROM
Person p
JOIN PersonCriteria c1 on (p.PersonID=c1.PersonID AND c1.CriteriaID=1)
JOIN PersonCriteria c2 on (p.PersonID=c2.PersonID AND c2.CriteriaID=2)
JOIN PersonCriteria c3 on (p.PersonID=c3.PersonID AND c3.CriteriaID IN (3,4))
列(PersonID、CriteriaID)のPersonCriteriaにインデックスを追加すると(正確にこの順序で!)、どのような場合でも取得するのとほぼ同じ速さだと思います。