Я очень ищу способ отфильтровать строки из таблицы SELECT
одной таблицы на основе определенных значений в строках другой таблицы.удаление строк из SELECT на основе столбцов в другой таблице
Я экспериментирую с примером структуры ниже. У меня есть таблица содержимого блога (одна строка за сообщение в блоге) и еще одна таблица метаданных о сообщениях (одна строка для пары ключ-значение, каждая строка со столбцом, связанная с записью в блоге, много строк в Сообщение блога). Я хочу вытащить строку posts
только в том случае, если в metadata
нет строк, где metadata.pid=posts.pid AND metadata.k='optout'
. То есть, для структуры примера ниже, я просто хочу вернуть строку posts.id=1
.
(на основе того, что я пробовал) JOIN
s не до конца удаления сообщения, которые имеют некоторые метаданные где 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 строк в постах, вызывают каждый pid
имеет ряд метаданных где k!='optout'
.
Итак, позвольте мне увидеть, если я получаю это ... на должность с OptOut подзапрос соответствует ряд метаданных, поэтому metadata.mdid не равно нулю, поэтому он не выбирается. Но пост без optout, подзапрос не соответствует строке, поэтому правая сторона заполняется нулями, поэтому предложение where истинно. – alxndr
Я добавил еще один раздел ответа, связанного с тем, как работает соединение, которое должно очистить от него любые серые области. Надеюсь, это поможет! – futureal