[英]mysql select from where different
我需要選擇一個條目列表,但需要跳過在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,因為它們在“推薦”表中不存在。
這是我嘗試過的方法,但是顯然缺少了一些東西:
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_id
更改為and o.customers_id != t.customer_id
, and o.customers_id = t.customer_id
我只會得到兩個表中的客戶(在這種情況下,分別為20和32)。
您可以在此上LEFT JOIN
。
使用LEFT JOIN
的原因是因為它會顯示左側定義的表中的所有記錄,而不論右側定義的表是否具有匹配的記錄。 當表Orders
與表testimonials
結合在一起時,所有不匹配的記錄的testimonials
表中的列的值為null,這就是您要查找的記錄。 要過濾掉,我們只需要通過檢查IS NULL
列來獲取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);
這是簡單的方法。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.