-1

エントリのリストを選択する必要がありますが、2 つの異なるテーブルで一致するフィールドを持つエントリをスキップする必要があります。これが私のDB構造です

注文:

| 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         |

したがって、Orders テーブルにあるすべての顧客を選択する必要がありますが、Testimonials テーブルにある場合はスキップする必要があります。上記の例では、顧客 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_idを に変更するとand o.customers_id = t.customer_id、両方のテーブル (この場合は 20 と 32) にいる顧客のみが取得されるため、正しい方向に進んでいると感じています。

4

2 に答える 2

4

これでできますLEFT JOIN

使用する理由は、右側で定義されたテーブルに一致するレコードがあるかどうかに関係なく、左側LEFT JOINで定義されたテーブルのすべてのレコードを表示するためです。tableが table と結合されている場合、一致しないすべてのレコードは、テーブル内の列に対して null の値を持ち、それが探しているものです。除外するには、列を でチェックして、値を持つレコードを取得するだけです。OrderstestimonialstestimonialsNULLIS 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依存している場合は、参照整合性を維持するために制約を適用する必要があります。CustomersFOREIGN 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 に答える