1


私はいくつかのサンプルデータを含む次のmysqlテーブルを持っています。

1)テーブル:ai_shipment

+----+---------------------+---------------------+------------------+
| id | booking_date        | loading_date        | container_number |
+----+---------------------+---------------------+------------------+
|  1 | 2012-08-03 00:00:00 | 2012-08-04 00:00:00 | ABB987987BBC6    |
|  2 | 2012-08-05 00:00:00 | 2012-08-07 00:00:00 | BHJKKU78786GH    |
+----+---------------------+---------------------+------------------+

2)テーブル:ai_purchase_item

+----+---------+----------+-----------+-----------+
| id | item_id | quantity | cost      | rate      |
+----+---------+----------+-----------+-----------+
|  1 |       1 |       50 | 1200.0000 | 1355.0000 |
|  2 |       2 |       20 |  550.0000 |  675.0000 |
|  3 |       4 |       70 |   70.0000 |   70.0000 |
|  4 |       6 |       90 |   90.0000 |   90.0000 |
|  5 |       7 |       80 |   80.0000 |   80.0000 |
+----+---------+----------+-----------+-----------+

3)テーブル:shipment_purchase_item

+----+-------------+------------------+
| id | shipment_id | purchase_item_id |
+----+-------------+------------------+
|  1 |           1 |                2 |
|  2 |           2 |                3 |
+----+-------------+------------------+

基本的に、購入したすべてのアイテムの詳細をai_purchase_itemai_shipment保存し、配送の詳細を保存し、配送ai_shipment_purchase_itemされたアイテムの記録を保存します。

私がやろうとしているのは、ai_purchase_item出荷されていないすべてのレコードを選択したいということです。つまり、外部キーはに存在してはなりませんai_shipment_purchase_item

上記のレコードを参照すると、フェッチされると予想される結果は次のようになります。

+----+---------+----------+-----------+-----------+
| id | item_id | quantity | cost      | rate      |
+----+---------+----------+-----------+-----------+
|  1 |       1 |       50 | 1200.0000 | 1355.0000 |
|  4 |       6 |       90 |   90.0000 |   90.0000 |
|  5 |       7 |       80 |   80.0000 |   80.0000 |
+----+---------+----------+-----------+-----------+

私はこのようなことを試しました(SQLクエリが適切でないことを知っています)

 SELECT 
    pi.id, 
    pi.item_id, 
    pi.quantity, 
    pi.cost,
    pi.rate 
 FROM 
    ai_purchase_item pi 
 JOIN 
    ai_shipment_purchase_item spi ON spi.purchase_item_id = pi.id
 WHERE NOT EXISTS (SELECT spi.purchase_item_id WHERE spi.purchase_item_id = pi.id)

ありがとうございました。

4

2 に答える 2

3

MySQL で 1 つのテーブルに存在し、別のテーブルには存在しない値を見つけるには、3 つの一般的な方法があります。

  • LEFT JOIN
  • NOT EXISTS
  • NOT IN

を使用したアプローチは次のNOT EXISTSとおりです。

SELECT 
    pi.id, 
    pi.item_id, 
    pi.quantity, 
    pi.cost,
    pi.rate 
FROM 
    ai_purchase_item AS pi 
WHERE NOT EXISTS
(
    SELECT *
    FROM ai_shipment_purchase_item AS spi
    WHERE spi.purchase_item_id = pi.id
)

そして、ここにありますLEFT JOIN

 SELECT 
    pi.id, 
    pi.item_id, 
    pi.quantity, 
    pi.cost,
    pi.rate 
 FROM 
    ai_purchase_item AS pi 
 LEFT JOIN 
    ai_shipment_purchase_item AS spi ON spi.purchase_item_id = pi.id
 WHERE spi.purchase_item_id IS NULL

そして、ここにありますNOT IN

SELECT 
    pi.id, 
    pi.item_id, 
    pi.quantity, 
    pi.cost,
    pi.rate 
FROM 
    ai_purchase_item AS pi 
WHERE pi.id NOT IN
(
     SELECT purchase_item_id
     FROM ai_shipment_purchase_item
)

Quassnoi による次の記事では、これらの各アプローチのパフォーマンスを比較しています。

結論は次のとおりです。

MySQL で欠損値を検索する最良の方法は、NOT EXISTS ではなく LEFT JOIN / IS NULL または NOT IN を使用することです。

于 2012-07-30T10:40:05.107 に答える
1
select * from ai_purchase_item where id not in (select distinct(purchase_item_id) from shipment_purchase_item )
于 2012-07-30T10:41:53.440 に答える