我有一个带有某种额外密钥的产品表,用于分析和内容的值。我的问题是,如果很容易找到具有指定密钥的产品,那么找到一个没有密钥的会更加棘手。让我们剪掉谈话并展示代码。
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
受伤,则需要额外积分。
答案 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