0

私はこの MySQL の問題を解決しようとしています...問題の半分は私の質問の文言にあります。これが以前に解決されていた場合は申し訳ありません。多くの検索を行いましたが、解決策を見つけることができませんでした。

orders と order_items という 2 つのテーブルがあります。各注文には多くの注文アイテムを含めることができます。

1 つの注文項目のみを含み、別の注文項目を含まない注文を返す検索を実行する必要があり、その逆も同様です。

この点を説明するには:

テーブルオーダー

order_id
1
2
3

テーブル order_items

order_item_id | order_item_type | order_id
1 | あ | 1
2 | あ | 2
3 | ビ | 2
4 | ビ | 3

私がする必要があるのは、アイテム A のみ、アイテム B のみ、およびその両方を含む注文を取得することです。

ご覧のとおり、アイテム A のみが注文 1 を返し、アイテム B のみが注文 3 を返し、両方とも注文 2 を返す必要があります。

最善を尽くしたにもかかわらず、何も機能しません。これは、アイテム A のみの注文を返品する現在の試みです。

    選択する *
    FROMオーダー
    LEFT OUTER JOIN order_items
    ON order_items.order_id = orders.order_id
    WHERE order_items.order_item_type IN ('A')
    AND order_items.order_item_type NOT IN ('B')
    GROUP BY orders.order_id

経験豊富な人はおそらく私の試みを見て推測できるので、これは注文1と注文2の両方を返します。これはおそらくサブクエリで実行できると思いますが、適切な結合で実行できると思います...方法がわかりませんそれをするために。ありがとうございました!

4

1 に答える 1

0

単一の order_item を選択した場合:

SELECT i.* FROM order_items i
WHERE i.order_item_type = 'A' AND
  (SELECT COUNT(order_id) FROM order_items WHERE order_id = i.order_id) = 1

2 つの order_item を選択:

SELECT i.* FROM order_items i
WHERE i.order_item_type IN ('A', 'B') AND
  (SELECT COUNT(order_id) FROM order_items WHERE order_id = i.order_id) = 2

orders好きなようにテーブルに参加します。

于 2012-04-26T16:16:37.317 に答える