gpt4 book ai didi

sql - 高级 (?) AND/OR 查询

转载 作者:行者123 更新时间:2023-11-29 01:48:10 25 4
gpt4 key购买 nike

对于相当简单的表结构,即。人员、标准和 PersonCriteria(组合表),我现在设置了一个查询,选择所有符合所有选定条件的人。

此时查询本身看起来像这样:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com