-1

我需要选择一个条目列表,但需要跳过那些在 2 个不同表中具有匹配字段的条目。这是我的数据库结构

订单:

| orders_id | customers_id | 
| 100       | 01           |
| 101       | 20           |
| 102       | 32           |
| 103       | 48           |
| 104       | 99           |

客户(仅供参考):

| firstname | lastname | customers_id |
| John      | Doe      | 20           |
| Fred      | Flinty   | 22           |
| Mark      | Smith    | 32           |

推荐:

| customers_id | testimonial |
| 20           | aaa         |
| 32           | bbb         |
| 38           | ccc         |
| 49           | ddd         |
| 55           | eee         |

因此,我需要选择我的订单表中的所有客户,但如果他们在我的推荐表中,则需要跳过它们。在上面显示的示例中,我只需要选择客户 01、48 和 99,因为它们不存在于 Testimonials 表中。

这是我尝试过的,但显然缺少一些东西:

SELECT c.firstname, c.lastname, c.customers_id, o.orders_id, 
       o.customers_id, s.date_added as status_date
FROM (orders o, testimonials t )
JOIN customers c
ON c.customers_id = o.customers_id
JOIN  status_history s
ON s.orders_id = o.orders_id
  and s.orders_status_id = o.orders_status
  and o.customers_id != t.customer_id
  order by o.orders_id ASC;

有人可以告诉我我做错了什么以及如何跳过在两个表格(订单和推荐)中找到的客户吗?我觉得我走在正确的轨道上,因为如果我将其更改为and o.customers_id != t.customer_idand o.customers_id = t.customer_id我只会得到两个表中的客户(在本例中为 20 和 32)。

4

2 回答 2

4

你可以LEFT JOIN在这个。

使用的原因LEFT JOIN是因为它将显示左侧定义的表中的所有记录,无论它是否在右侧定义的表中有匹配的记录。当 tableOrders与 table 连接时testimonials,所有不匹配的记录对于表中的列的值为 null ,testimonials这就是您要查找的记录。要过滤掉,我们只需要NULL通过检查带有值的列来获取带有值的记录IS NULL

SELECT  a.*, b.*
FROM    orders a
        LEFT JOIN testimonials c
            ON a.customers_ID = c.customers_ID
        LEFT JOIN customers b
            ON a.customers_ID = b.customers_ID
WHERE   c.customers_ID IS NULL

要进一步了解有关联接的更多信息,请访问以下链接:


加起来INDEX

如果在真实数据库上,Orders表以及Testimonials始终依赖于Customers表,FOREIGN KEY则应强制执行约束以保持引用完整性

就是这样:

ALTER TABLE Orders ADD CONSTRAINT tb_fk1 
    FOREIGN KEY (Customers_ID) REFERENCES Customers(Customers_ID);
ALTER TABLE Testimonials ADD CONSTRAINT tb_fk2
    FOREIGN KEY (Customers_ID) REFERENCES Customers(Customers_ID);  
于 2013-03-29T03:06:44.573 回答
3

这是简单的方法。

select c.* from order as o
join customers as c on o.customers_id = c.customers_id
where o.customers_id not in(select customers_id from testimonials)
于 2013-03-29T03:10:53.610 回答