2

完全に定義されたアイテムを含むテーブルと、このパラメーターに使用可能なすべての値が NULL に必要なため、あいまい/貪欲な注文の可能性がある 2 つ目のテーブルがあります。

items
+-----------------------+
| item_id | color | size |
|---------+-------+------|
|    1    |  blue |    8 |
|    2    |   red |    6 |
|    3    | green |    7 |
|    4    | black |    6 |
+------------------------+

orders
+-------------------------+
| order_id | color | size |
|----------+-------+------|
|     1    |   red |    6 |
|     2    | green |    8 |
|     3    |  NULL |    6 |
|     4    |  blue | NULL |
|     5    |  NULL | NULL |
+-------------------------+

すべての注文を満たすために必要なアイテムの完全なリストを生成する効率的な方法はありますか?

+--------------------+
| order_id | item_id |
|----------+---------|
|     1    |    2    |
|     3    |    2    |
|     3    |    4    |
|     4    |    1    |
|     5    |    1    |
|     5    |    2    |
|     5    |    3    |
|     5    |    4    |
+--------------------+

INNER JOIN がこれを行うことができるように思えますが、このようなものは明らかに、注文テーブルの貪欲なワイルドカードとして NULL 値の可能性を考慮していません。

SELECT order_id, item_id
FROM orders
INNER JOIN items ON orders.color = items.color AND orders.size = items.size

何か案は?

4

3 に答える 3

3

次のことを試してください。

SELECT order_id, item_id
FROM orders
INNER JOIN items ON (orders.color IS NULL OR orders.color = items.color)
    AND (orders.size IS NULL OR orders.size = items.size)

それが役立つかどうか、または質問を誤解したかどうかを教えてください。

于 2012-12-11T21:56:52.567 に答える
1

の条件を書き直すとJOIN、目的の結果が得られます。

SELECT order_id, item_id
FROM orders
JOIN items
    ON ((orders.color = items.color OR orders.color IS NULL)
        AND (orders.size = items.size OR orders.size IS NULL))

ただし、orders テーブルは、現在の orders テーブルよりも、おそらくこのクエリの結果に似ているはずです。

于 2012-12-11T22:12:34.207 に答える
1

IFNULLこれには次の関数を使用できます。

SELECT order_id, item_id
  FROM orders
  JOIN items ON IFNULL(orders.color, items.color) = items.color
            AND IFNULL(orders.size, items.size) = items.size

orders の値が null の場合、items の値が使用されます(したがって、一致します)。

于 2012-12-11T22:13:16.810 に答える