удаление строк из SELECT на основе столбцы в другой таблице

Я в значительной степени ищу способ отфильтровать строки из 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' .

5
задан alxndr 12 January 2011 в 07:17
поделиться