Estou construindo um site que tem posts e cada post pode ter zero ou mais tags. Os usuários podem selecionar zero ou mais tags para bloquear. Se um tag for bloqueado, significa que as consultas que selecionam posts não selecionarão nenhum post que esteja marcado com qualquer um dos tags bloqueados do usuário. Eu consegui fazer uma consulta que exclui posts com qualquer tag específica, mas quando tento adicionar uma cláusula que exclui posts com qualquer um dos tags bloqueados do usuário, isso não funciona. Não só os posts com tags bloqueadas ainda são mostrados, mas eu recebo posts duplicados (um para cada tag com que o post está marcado) e não recebo nenhum post que não tenha tags. Como eu permito que os usuários designem um número arbitrário de tags bloqueadas e então filtrem consultas de posts com base nas tags que os posts têm?
Aqui estão alguns exemplos de tabelas relevantes, simplificadas para mostrar apenas as colunas relevantes:
postagens
eu ia | título |
---|---|
1 | Postar A |
2 | Posto B |
3 | Postagem C |
Etiquetas
eu ia | nome |
---|---|
1 | Etiqueta 1 |
2 | Etiqueta 2 |
3 | Etiqueta 3 |
postagens_tags
eu ia | marcação | publicar |
---|---|---|
1 | 1 | 1 |
2 | 2 | 1 |
3 | 3 | 2 |
tags bloqueadas
eu ia | marcação | usuário |
---|---|---|
1 | 1 | usuário1 |
2 | 2 | usuário1 |
3 | 3 | usuário2 |
e minha consulta se parece com isso (há muito mais na consulta real, estou apenas mostrando o básico e a cláusula relevante):
SELECT *
FROM posts
JOIN tags_posts ON tags_posts.post = posts.id
WHERE tags_posts.tag NOT IN
(SELECT blocked_tags.tag
FROM blocked_tags
WHERE blocked_tags.user = :user)
E :user é substituído pelo id do usuário atual. Digamos, por exemplo, que o usuário atual é user1, então, com base nos dados da tabela acima, eu esperaria que essa consulta retornasse o seguinte:
eu ia | título |
---|---|
2 | Posto B |
3 | Postagem C |
e se o usuário atual for user2, então eu esperaria que ele retornasse o seguinte:
eu ia | título |
---|---|
1 | Postar A |
2 | Posto B |
Mas, em vez disso, não importa qual usuário eu seja, recebo o seguinte:
eu ia | título |
---|---|
1 | Postar A |
1 | Postar A |
2 | Posto B |
Qual é a maneira correta de filtrar as postagens para que elas excluam qualquer uma que esteja marcada com qualquer uma das tags bloqueadas do usuário? Obrigado.