Я в значительной степени ищу способ отфильтровать строки из SELECT
одной таблицы на основе определенных значений в строках другой таблицы.
Я' m экспериментируя с приведенным ниже примером структуры. У меня есть таблица содержимого сообщения в блоге (одна строка на сообщение в блоге) и еще одна таблица метаданных о сообщениях (одна строка на пару ключ-значение; каждая строка со столбцом, связывающим ее с сообщением в блоге; много строк на Сообщение блога). Я хочу вывести строку из сообщений
только в том случае, если в метаданных
нет строк, где metadata.pid = posts.pid И metadata.k = 'optout'
. То есть для приведенного ниже примера структуры я просто хочу вернуть строку posts.id = 1
.
(На основе того, что я пробовал) JOIN
s don Не удаляйте сообщения, у которых есть метаданные, где metadata.k = 'optout'
, потому что другая строка метаданных для этого pid
означает, что она попадает в результаты.
mysql> select * from posts;
+-----+-------+--------------+
| pid | title | content |
+-----+-------+--------------+
| 1 | Foo | Some content |
| 2 | Bar | More content |
| 3 | Baz | Something |
+-----+-------+--------------+
3 rows in set (0.00 sec)
mysql> select * from metadata;
+------+-----+--------+-----------+
| mdid | pid | k | v |
+------+-----+--------+-----------+
| 1 | 1 | date | yesterday |
| 2 | 1 | thumb | img.jpg |
| 3 | 2 | date | today |
| 4 | 2 | optout | true |
| 5 | 3 | date | tomorrow |
| 6 | 3 | optout | true |
+------+-----+--------+-----------+
6 rows in set (0.00 sec)
Подзапрос может дать мне обратное тому, что я хочу:
mysql> select posts.* from posts where pid = any (select pid from metadata where k = 'optout');
+-----+-------+--------------+
| pid | title | content |
+-----+-------+--------------+
| 2 | Bar | More content |
| 3 | Baz | Something |
+-----+-------+--------------+
2 rows in set (0.00 sec)
... но использование pid! = Any (...)
дает мне все 3 строки в сообщениях, потому что каждая single pid
имеет строку метаданных, где k! = 'optout'
.