mysql - SQL - 如何检索包含另一个元素的所有项目的结果集?

标签 mysql sql group-by having

我将通过以下场景简单地解释用例。 基本上,我想从 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/

相关文章:

sql - 为什么函数(用作表中列的默认约束)无法更改?

mysql - mysql fulltext 的性能取决于关键字的顺序

mysql - LEFT JOIN 与表两次以获得单独的记录

sql - 如何在 Postgres 中使用时间戳字段按日期分组?

mysql - SQL SELECT MIN 值与 WHERE 语句

PHP sql 语句 where 子句到多个数组值

javascript - 无法将编辑的内容存储到数据库

mysql - mysql工作台中Info表下的表行表示什么?

sql - 从没有主键的表中删除行,SQL

mysql - 选择从 1 列计数到 2 列