Найти любой элемент без соответствующего ключа - PullRequest
2 голосов
/ 26 января 2012

У меня есть таблица продуктов с каким-то дополнительным ключом, значениями, используемыми для аналитики и тому подобным. Моя проблема в том, что если найти продукт с указанным ключом легко, гораздо сложнее найти тот, который без ключа. Давайте порежем разговор и покажем код.

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 в примере ниже). В таблице метасов нет элементов, если ключ не установлен.

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

Дополнительные очки, если в процессе нет повреждений <1016 *. </p>

Ответы [ 2 ]

3 голосов
/ 26 января 2012

Можно использовать 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)
0 голосов
/ 26 января 2012

Если я понимаю, что вы ищете, используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...