我不得不说-我很困惑。我想不出任何解决方案,甚至会接近。我会尝试在这些方向上寻找解决方案:
- 用户定义的聚合函数。也许您可以创建一个函数,该函数将所需的表达式(以简化的语法)和单个人的行作为参数。然后,该函数解析表达式并将其与行进行匹配。嗯…也许MySQL包含一些串联聚合函数和regex匹配函数?那么,这可能是一个解决方案(尽管可能不是非常快的解决方案)。
- 分析功能。我不假装自己理解它们,但是据我所知,我认为它们通常都朝着这个方向发展。尽管我不知道是否会有适合该需求的功能。
补充: 啊,我想我明白了!虽然我认为演出会很惨。但这行得通!例如,如果您需要搜索,
1 AND 2 AND (3 OR 4)则可以编写:
SELECt *FROM Persons AWHERe 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: 这是另一个,尽管性能可能会更差:
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: 这是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添加一个索引(正是按此顺序!),那么我认为它无论如何都将与您获得的速度一样快。



