找到没有相关键的任何元素

时间:2012-01-26 13:36:03

标签: mysql sql

我有一个带有某种额外密钥的产品表,用于分析和内容的值。我的问题是,如果很容易找到具有指定密钥的产品,那么找到一个没有密钥的会更加棘手。让我们剪掉谈话并展示代码。

SELECT products.*
    FROM products
    JOIN metas ON products.id = metas.product_id
    WHERE
        metas.key = 'mykey' AND
        metas.value = '1'

我将获得指定 mykey 键的所有产品,并设置为值1(下例中的1)。

现在我想要在没有设置关键 mykey 的情况下获取所有产品(下例中为2)。如果未设置密钥,则metas表中不存在任何元素。

+-------------+     +----------------------------+
| products    |     | metas                      |
+=============+     +============+=======+=======+
|id           |     | product_id | key   | value |
+-------------+     +------------+-------+-------+
| 1           |     | 1          | mykey | 1     |
| 2           |     | 1          | foo   | bar   |
+-------------+     +------------+-------+-------+

如果在此过程中没有子select受伤,则需要额外积分。

2 个答案:

答案 0 :(得分:3)

使用NOT EXISTS是一种选择。

SELECT p.*
FROM   products as p
WHERE  NOT EXISTS (SELECT  m.product_id
                   FROM    metas AS m
                   WHERE   m.key = 'mykey'
                           AND m.value = '1'
                           AND m.product_id = p.product_id)

答案 1 :(得分:0)

如果我理解你所追求的是什么,请使用LEFT JOIN并测试NULL:

SELECT products.*
FROM products
LEFT JOIN metas ON products.id = metas.product_id
WHERE
    (metas.key = 'mykey' AND metas.value = '1')
    OR mets.key IS NULL

如果您不想同时同时处理这两个条件(问题中不明确),请删除WHERE子句的第一部分,仅测试NULL。

SELECT products.*
FROM products
LEFT JOIN metas ON products.id = metas.product_id
WHERE
   metas.key IS NULL