sách gpt4 ai đã đi

Truy vấn AND/OR nâng cao(?)

In lại 作者:行者123 更新时间:2023-11-29 01:48:10 26 4
mua khóa gpt4 Nike

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

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

LỰA CHỌN 
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...

我不确定从哪里开始这个额外的级别。我希望其他人这样做..:-)

1 Câu trả lời

我不得不说 - 我被难住了。我想不出任何接近的解决方案。我会尝试在这些方向上寻找解决方案:

  • 用户定义的聚合函数。也许您可以创建一个函数,将所需的表达式(以简化语法)和单个人的行作为参数。然后该函数解析表达式并将其与行进行匹配。嗯...也许 MySQL 包含一些连接聚合函数和正则表达式匹配函数?这可能是一个解决方案(虽然可能不是一个非常快的解决方案)。
  • 分析函数。我不假装我了解他们,但就我对他们的了解,我认为他们总体上是这个方向。虽然不知道会不会有适合这个需求的功能。

添加:啊,我想我明白了!虽然我觉得表演会很惨。但这会起作用!例如,如果您需要搜索 1 AND 2 AND (3 OR 4),那么您可以这样写:

LỰA CHỌN
*
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/

26 4 0
Bài viết được đề xuất: mysql - 替代 MySQL CASE/WHEN?
Bài viết được đề xuất: android - 以编程方式修改 SipAddress
Bài viết được đề xuất: PHP-从数据库中获取昨天的数据
Bài viết được đề xuất: php - 从Mysql获取rowid
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com