我将通过以下场景简单地解释用例。 基本上,我想从 pts_table 中找到所有 pts/s,其中包含 pl001 的所有订单
pl_table
========
pl_id | order_id
pl001 order001
pts_table
=========
pts_id | order_id
pts001 order001
pts002 order001
pts002 order002
这是我正在尝试的查询,
SELECT pts_id
FROM pts_table
WHERE pts_table.order_id IN (SELECT DISTINCT(plt.order_id) FROM pl_table
as plt where plt.pl_id=pl001)// to check element equality.
GROUP BY pts_id
HAVING COUNT(DISTINCT pts_table.order_id) = (SELECT COUNT(plt2.order_id)
FROM pl_table as plt2 where plt.pl_id=pl001)//to check size equality.
但不幸的是,这个查询同时返回了 pts001 和 pts002,这是不正确的。它应该只返回 pts001 作为结果! 我发现这是由于分组部分不正确。
任何人都可以建议我如何纠正这个或任何其他更好的方法吗? 非常感谢任何帮助。
最佳答案
这很棘手。它检查的是匹配 的订单数,而不是不匹配的订单数。因此,pl002 未计入计数。
SELECT p.pts_id
FROM pts_table p LEFT JOIN
pl_table p2
ON p.order_id = p2.order_id AND p2.pl_id = 'pl001'
GROUP BY p.pts_id
HAVING COUNT(*) = COUNT(p2.order_id) AND -- All match
COUNT(*) = (SELECT COUNT(*) FROM pl_table WHERE pl.pl_id = 'pl001') -- match all of them
关于mysql - SQL - 如何检索包含另一个元素的所有项目的结果集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52063517/