提问人:hanji 提问时间:7/5/2023 最后编辑:GMBhanji 更新时间:7/30/2023 访问量:42
SQL 查找 custID 为 0 且 custID 为 <> 0 的电子邮件
SQL to find emails that have custID 0 AND custID <> 0
问:
我有一个包含“订单”表 (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],因为她只有客户记录(没有访客)。
答:
0赞
GMB
7/5/2023
#1
使用和过滤:group by
having
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
明!非常感谢。
下一个:sql 中查询的聚合
评论