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

标签 sql mysql

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

查询本身现在看起来像这样:

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/

相关文章:

mysql - 嵌套case语句sql

php - 我如何使用 PHP 将 SQL 表文本字段中的数据调用到 HTML 文本区域? (简单文章管理系统的所有部分)

java - jOOQ:获取别名字段的最佳方法(来自#as(alias,aliasFunction))

Linux 上的 MySQL 工作台

php - max_user_connections 错误,这是什么意思?

php - 索引对 where 子句中没有索引列的查询有帮助吗?

sql - 如何在 Postgres 中构建一个函数来计算两个 "select count(*)"查询的百分比?

java - 从 MySQL 数据库中获取插入行的索引

PHP 表单数据未复制到数据库

mysql - 用 SELECT 语句中不同表中的一个值替换另一个值