栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Advanced (?) AND / OR 查询

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Advanced (?) AND / OR 查询

我不得不说-我很困惑。我想不出任何解决方案,甚至会接近。我会尝试在这些方向上寻找解决方案:

  • 用户定义的聚合函数。也许您可以创建一个函数,该函数将所需的表达式(以简化的语法)和单个人的行作为参数。然后,该函数解析表达式并将其与行进行匹配。嗯…也许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添加一个索引(正是按此顺序!),那么我认为它无论如何都将与您获得的速度一样快。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/612248.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号