SQL 查找 custID 为 0 且 custID 为 <> 0 的电子邮件

SQL to find emails that have custID 0 AND custID <> 0

提问人:hanji 提问时间:7/5/2023 最后编辑:GMBhanji 更新时间:7/30/2023 访问量:42

问:

我有一个包含“订单”表 (tblOrders) 的电子商务数据库。在此表中,有具有 OrderTotal、Name、Email 等的单个订单。如果用户以“访客”身份签出,则将添加 CustID 0。如果用户签出并创建或以客户身份登录,则 CustID 值将不为 0 (int)。

我正在尝试查找以登录用户(不是 0)身份订购但也以访客身份签出 (0) 的客户(不同的电子邮件)。我想找到这些记录,以便将他们的客人结账分配给他们的客户 ID。

我一直在尝试 INNER JOIN 和 HAVING 的组合,但我一直在敲打我的头。希望有一个全新的视角。

为了简单起见,这里是该表的一个非常精简的架构。

CREATE TABLE `tblOrders` (
    `OrderID` int NOT NULL,
    `CustID` int NOT NULL,
    `Email` varchar(200) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
ALTER TABLE `tblOrders`
    ADD PRIMARY KEY (`OrderID`),
    ADD KEY `CustID` (`CustID`),
    ADD KEY `Email` (`Email`);
ALTER TABLE `tblOrders`
  MODIFY `OrderID` int NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;

INSERT INTO tblOrders(OrderID, CustID, Email)
VALUES(1,0,'[email protected]');
INSERT INTO tblOrders(OrderID, CustID, Email)
VALUES(2,1,'[email protected]');
INSERT INTO tblOrders(OrderID, CustID, Email)
VALUES(3,0,'[email protected]');
INSERT INTO tblOrders(OrderID, CustID, Email)
VALUES(4,0,'[email protected]');
INSERT INTO tblOrders(OrderID, CustID, Email)
VALUES(5,2,'[email protected]');
INSERT INTO tblOrders(OrderID, CustID, Email)
VALUES(6,3,'[email protected]');

在此示例中,我希望获得一个记录集,其中显示 [email protected][email protected] 同时具有客户记录和访客记录。此结果集不包括 [email protected],因为该电子邮件只有访客记录,并且不会显示 [email protected],因为她只有客户记录(没有访客)。

sql MySQL的 聚合函数 拥有

评论


答:

0赞 GMB 7/5/2023 #1

使用和过滤:group byhaving

select email
from tblOrders
group by email
having min(custID) = 0   -- ordered at least once as guest
   and max(custID) > 0   -- and at least once as non-guest

这假设没有负数 s,这似乎与您的用例相关。custID

有多种方法可以使条款的措辞符合要求,以下是一些替代方案:having

having max(custID = 0) = 1 and max(custID > 0) = 1
having min(custID) = 0 and max(custID) <> min(custID) 

评论

0赞 hanji 7/5/2023
明!非常感谢。