2

我有一个包含完美定义的项目的表和第二个表,其中可能包含模糊/贪婪的订单,因为 NULL 需要此参数的所有可用值。

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