对于一个相当简单的表结构,即。人员、标准和人员标准 (组合表),我目前设置了一个查询,选择具有所有选定条件的所有人员。
查询本身现在看起来像这样:
SELECT
p.PersonID
FROM
Person p,
( SELECT DISTINCT PersonID, CriteriaID
FROM PersonCriteria
WHERE CriteriaID in (#list_of_ids#)
) k
WHERE
p.PersonID= k.PersonID
GROUP BY
p.PersonID
HAVING
Count(*) = #Listlength of list_of_ids#
到目前为止没有问题,一切正常。
现在我想为用户提供在搜索中添加一些 AND 和 OR 变量的可能性,即。有人可能会说:
I'm looking for a person that possesses: Criteria 1 AND 3 AND 4 (which would be covered by the query above) AND (5 OR 6 OR 7) AND (8 OR 9) and so on...
我不知道从哪里开始这个额外的级别。我希望其他人也这样做..:-)
最佳答案
我不得不说 - 我被难住了。我想不出任何接近的解决方案。我会尝试在这些方向寻找解决方案:
- 用户定义的聚合函数。也许您可以创建一个函数,将所需的表达式(以简化的语法)和单个人的行作为参数。然后该函数解析表达式并将其与行进行匹配。嗯...也许 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 个:这是另一个,但性能可能会更差:
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 添加索引(完全按照这个顺序!),那么我认为在任何情况下它都会尽可能快。
关于sql - 高级 (?) AND/OR 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1106419/