Mysql 如何选择相同“userid”的其他字段具有特定值的行?
我有这种桌子(简化): 并希望选择所有订单,其中每个Mysql 如何选择相同“userid”的其他字段具有特定值的行?,mysql,Mysql,我有这种桌子(简化): 并希望选择所有订单,其中每个用户ID的状态为IN('A','B'),但在('C','D')中根本没有订单 因此,上述数据的输出将给出ID=1、2和3的订单。用户ID=10有订单A和B,但没有订单C或D 换言之:为订单状态为A或B,但没有状态为C或D的客户选择订单 我从这个开始: SELECT xcart_orders.orderid, xcart_orders.* FROM xcart_orders JOIN (
用户ID的状态为IN('A','B')
,但在('C','D')中根本没有订单
因此,上述数据的输出将给出ID=1、2和3的订单。用户ID=10有订单A和B,但没有订单C或D
换言之:为订单状态为A或B,但没有状态为C或D的客户选择订单
我从这个开始:
SELECT
xcart_orders.orderid,
xcart_orders.*
FROM xcart_orders
JOIN (
select count(*) as bad_statuses, userid from xcart_orders
where status in ('C','D')
group by userid
) bo
ON bo.userid=xcart_orders.userid
JOIN (
select count(*) as good_statuses, userid from xcart_orders
where status in ('A','B')
group by userid
) bo2
ON bo2.userid=xcart_orders.userid
WHERE bo2.good_statuses>0 and bo.bad_statuses=0
但是想一想,count(*)
对于“坏”状态不会返回零,所以我没有得到任何结果。您有一个没有分组依据的聚合,为了检查结果,您需要我们拥有而不是WHERE
SELECT
xcart_orders.orderid,
xcart_orders.*,
SUM(CASE WHEN xcart_orders.status in ('C','D') THEN 1 ELSE 0 END) AS bad_statuses,
SUM(CASE WHEN xcart_orders.status in ('A','B') THEN 1 ELSE 0 END) AS good_statuses
FROM xcart_orders
GROUP BY orderid
HAVING bad_statuses = 0
AND good_statuses > 0
请注意,您从xcart\u订单中获得的字段。*
将是随机的(或不确定的),如果您需要某个特定字段,则需要先订购
- 首先,根据
user\u id
分组,检查是否有与'A','B'
- 然后从那些
用户id
中选择订单:
输出
我总是得到状态好坏之和0或1,有点不对劲。要求和的订单必须具有相同的用户ID
。我是否必须再次连接同一个表来计算总和?您能否提供一些数据和预期输出?我可以给你一个更具体的答案。我已经添加了我的新查询,你能帮我吗?检查新查询。我结束了所有状态的计算,只有良好状态(有2个连接),而不是比较数字是否相同。谢谢
SELECT
xcart_orders.orderid,
xcart_orders.*,
SUM(CASE WHEN xcart_orders.status in ('C','D') THEN 1 ELSE 0 END) AS bad_statuses,
SUM(CASE WHEN xcart_orders.status in ('A','B') THEN 1 ELSE 0 END) AS good_statuses
FROM xcart_orders
GROUP BY orderid
HAVING bad_statuses = 0
AND good_statuses > 0
SELECT `user_id`
FROM orders1
GROUP BY `user_id`
HAVING COUNT(*) = COUNT(CASE WHEN `status` IN ('A', 'B') THEN 1 END);
SELECT *
FROM orders1
WHERE `user_id` IN (SELECT `user_id`
FROM orders1
GROUP BY `user_id`
HAVING COUNT(*) = COUNT(CASE WHEN `status` IN ('A', 'B') THEN 1 END)
);