gpt4 book ai didi

mysql - 通过外部连接排除所有可能的行?

转载 作者:行者123 更新时间:2023-11-30 23:23:11 25 4
gpt4 key购买 nike

我将从架构开始:

CREATE TABLE CustomersActions (
`caID` int(10) unsigned NOT NULL AUTO_INCREMENT primary key,
`cusID` int(11) unsigned NOT NULL,
`caTimestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
)
CREATE TABLE `Assignments` (
`asgID` int(10) unsigned NOT NULL AUTO_INCREMENT primary key,
`cusID` int(11) unsigned NOT NULL,
`asgAssigned` date DEFAULT NULL,
`astID` int(10) unsigned NOT NULL
)
CREATE TABLE `AssignmentStatuses` (
`astID` int(10) unsigned NOT NULL AUTO_INCREMENT primary key,
`astStatus` varchar(255) DEFAULT ''
)

我的原始查询是:

  SELECT DISTINCT
ca.cusID
FROM
CustomersActions ca
WHERE
NOT EXISTS (
SELECT
TRUE
FROM
Assignments asg
NATURAL JOIN AssignmentStatuses
WHERE
asg.cusID = ca.cusID
AND (
DATE_ADD(asgAssigned, INTERVAL 6 DAY) > NOW()
OR astStatus IN('Not contacted', 'Follow-up')
)
)

这样做是从 CustomersActions 中选择所有 cusID 条目,如果所述客户在 Assignments 中没有处于“Not contacted”或“Follow-up”中的行(对于任何日期范围)或在不到六天前分配了任何状态。

我尝试使用 LEFT JOIN 编写相同的查询以从 Assignments 中排除,如下所示:

SELECT DISTINCT
ca.cusID
FROM
CustomersActions ca
LEFT JOIN (
Assignments asg
NATURAL JOIN AssignmentStatuses
) ON (ca.cusID = asg.cusID)
WHERE
asgID IS NULL
OR DATE_ADD(asgAssigned, INTERVAL 6 DAY) < NOW()
OR astStatus IN('Not contacted', 'Follow-up')

问题是客户可能在 Assignments 中有多个条目,因此可以选择 cusID,即使他们有一个现有的行应该强制他们被排除在外。这对我来说很有意义,NOT EXISTS 解决了这个问题。

我想知道是否有一种方法可以执行与使用 NOT EXISTS 时的查询具有相同效果的单个查询。也就是说,如果客户有任何行满足排除条件,则客户应该被排除在外,而不仅仅是当他们的所有行都满足排除条件(或者如果他们没有)。

最佳答案

您是否尝试过使用 NOT IN 子句,例如:

SELECT DISTINCT
ca.cusID
FROM
CustomersActions ca
WHERE cusID
NOT IN (
SELECT
cusID
FROM
Assignments asg
INNER JOIN AssignmentStatuses ast
ON asg.astID = ast.astID
WHERE
DATE_ADD(asgAssigned, INTERVAL 6 DAY) > NOW()
OR astStatus IN('Not contacted', 'Follow-up')
)

关于mysql - 通过外部连接排除所有可能的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14656060/

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