【问题标题】:How to filter table across groups and their content如何跨组及其内容过滤表
【发布时间】:2017-10-29 10:32:39
【问题描述】:

在我的表中是必须生产的项目订单(在我的示例中是简单的)。 我必须只过滤那些完全完成的订单。如果所有订单(具有相同 order_id)的状态为“4”或“-1”,则订单已完成。

"id"    "order_id"  "item_nr"   "status"
"689"   "4"         "M2223"     "3"
"690"   "4"         "K3224"     "-1"
"691"   "4"         "X1837"     "4"
"692"   "4"         "M2338"     "0"
"693"   "5"         "E7273"     "4"
"694"   "5"         "E8883"     "-1"
"695"   "5"         "B9217"     "4"
"696"   "5"         "B2662"     "4"

在示例情况下:我想得到结果:

"693"   "5"         "E7273"     "4"
"694"   "5"         "E8883"     "-1"
"695"   "5"         "B9217"     "4"
"696"   "5"         "B2662"     "4"

如何选择这个?

【问题讨论】:

    标签: mysql sql select filter


    【解决方案1】:

    一种选择是将LEFT JOIN 您的表添加到一个子查询,该子查询标识所有 匹配订单,然后仅保留不匹配订单的记录。这意味着那些匹配的订单没有任何不完整状态的记录。

    SELECT t1.*
    FROM yourTable t1
    LEFT JOIN
    (
        SELECT order_id
        FROM yourTable
        WHERE status NOT IN ('4', '-1')
    ) t2
        ON t1.order_id = t2.order_id
    WHERE t2.order_id IS NULL
    

    输出:

    演示在这里:

    Rextester

    根据@shadow 的评论,我们也可以使用NOT EXISTS 来表达这个查询:

    SELECT t1.*
    FROM yourTable t1
    WHERE NOT EXISTS
    (
        SELECT 1
        FROM yourTable t2
        WHERE t2.status NOT IN ('4', '-1') AND t2.order_id = t1.order_id
    )
    

    【讨论】:

    • Here 是一个带有 Tim 查询的预期结果的 sqlfiddle。
    • 使用 not exists insted 或 not in 可能会加快速度。我喜欢这个解释,所以得到我的投票。
    • @Shadow 我用NOT EXISTS 进行了更新。老实说,我不经常使用它,但也许我应该研究在 MySQL 中使用它的性能优势。
    猜你喜欢
    • 2021-09-04
    • 2018-05-15
    • 2015-05-23
    • 1970-01-01
    • 2012-07-11
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多