簡體   English   中英

MySQL選擇從哪里不同

[英]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_idand 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM