【问题标题】:SQL Query to Filter a Table using two tables使用两个表过滤表的 SQL 查询
【发布时间】:2025-12-05 01:55:02
【问题描述】:

我目前有 4 个如下所示的 SQL 表:

CustomersTable、RegistrationTable、OrdersTable 和 OffersTable

enter image description here

我需要编写一个 SELECT 语句,从 CustomersTable(所有字段)中检索所有客户,这些客户包含与 RegistrationTable 匹配的行或与 OrdersTable 匹配且状态为“已关闭”的行,结果表中不应显示重复客户。

如您所见,CustomersTable 和 RegistrationTable 具有共同的字段“customerId”,但在 CustomersTable 和 OrdersTable 之间没有共同的字段。但是还有另一个表(OffersTable),其中包含“customerId”和“ID”字段,分别用于查询Customers 和Orders 表的信息。请记住,出现在 OfferTable 中的客户不一定会出现在 OrderTable 中,或者只是状态不是“已关闭”

因此,根据我上面的示例表,如果我要运行查询,它将返回以下结果:

enter image description here

结果表中不应显示重复的客户。 我真的很感谢你的帮助。 谢谢你的时间!!

注意 - 我正在使用 MySQL

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    尝试对每个表使用“Union”和“inner join”,如下所示:

     Select Customers.* from Customers inner join Registration on Customers. customerId= Registration.customerId
    
     union
    
    Select Customers.* from Customers inner join offers on Customers.customerId=offers.customerId 
    inner join Orders on orders.Id= offers.Id and Orders.Status='closed'
    

    【讨论】:

    • 谢谢,但需要提一下,在 Orders 表中没有 customerId 列。这就是为什么我在优惠表中附加数据的原因。匹配这些表客户 (customerId) - 报价 (customerId, ID) - 订单 (ID) 可以从客户查询到订单。
    • 抱歉误会,我已将查询编辑为与 offer 表进行内部联接
    • 没关系,感谢您的快速回复。我会尝试使用这句话!
    【解决方案2】:

    我想existsin,给定你想要的。您对表格的描述有点繁琐——这就是问题中的示例数据如此有用的原因。

    生成的查询将如下所示:

    select c.*
    from customers c
    where exists (select 1 from registrations r where r.customerid = c.customerid) or
          exists (select 1
                  from offers o join
                       orders oo
                       on o.id = oo.orderid
                  where o.customerid = c.customerid and
                        oo.status = 'closed'
                 );
    

    列名可能不太对。

    【讨论】:

    • 抱歉我的描述出现了麻烦。 Orders 表中的“orderId”列与 Offers 表中的“id”列是不同类型的数据。这种情况下,应该用这个“o.id = oo.id”而不是“o.id = oo.orderid”吧?
    • @KuronoK。 . . .这似乎是一个奇怪的外键关系。您应该编辑问题并提供示例数据。