Clear 0 Denunciar post Postado Dezembro 28, 2011 Olá pessoal, estou com o seguinte problema: Estou tentando fazer um select onde ele não traga informação da uma linha do DB.... "SELECT p.nodeid, p.contentid p.publishdate, p.url, c.categoryid, c.nodeid, a.previewimage, a.contentid, e.title FROM `node` AS p INNER JOIN `nodecategory` AS c ON p.`nodeid` = c.`nodeid` INNER JOIN `article` AS a ON p.`contentid` = a.`contentid` INNER JOIN `nodeinfo` AS e ON p.`nodeid` = e.`nodeid` WHERE c.`categoryid` IN (73,74,77,105,71,70,72,76,100,80,79,78,81,108,145,146,82,142,83,97,153) GROUP BY c.nodeid ORDER BY p.`publishdate` DESC LIMIT 4"; As tabelas: `node` ======= nodeid contentid url publishdate `nodeinfo` ======= nodeid title `node_category` ======= categoryid nodeid `article` ======= contentid previewimage ===================== Beleza, vamos ao que interessa... digamos que eu tenha uma categoria(categoyid) '150', e não queria trazer nada que esteja nessa categoria..... Acontece que um artigo pode estar em várias categorias, e por mais que eu bloqueie a categoria 150 no SELECT, ele continuará vindo por estar atrelado a outras categorias.... Como eu faço, para que QUALQUER item que esteja na categoria '150' não seja buscado no SELECT mesmo ele estando também em outra categoria além da '150'... Desde já agradeço a ajuda pessoal !! :D Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Dezembro 28, 2011 Acho que você está bloqueando na tabela errada .. veja que você tem 2 categoryid's .. e por vir das dúvidas, chegou a utilizar um NOT IN ? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Dezembro 28, 2011 Faça um sub-select com not exists SELECT p.nodeid, p.contentid p.publishdate, p.url, c.categoryid, c.nodeid, a.previewimage, a.contentid, e.title FROM `node` AS p INNER JOIN `nodecategory` AS c ON p.`nodeid` = c.`nodeid` INNER JOIN `article` AS a ON p.`contentid` = a.`contentid` INNER JOIN `nodeinfo` AS e ON p.`nodeid` = e.`nodeid` WHERE c.`categoryid` IN (73,74,77,105,71,70,72,76,100,80,79,78,81,108,145,146,82,142,83,97,153) and not exists (select null from 'article' as a2 where a2.`contentid` = a.`contentid` and a2.`contentid` = 150) GROUP BY c.nodeid ORDER BY p.`publishdate` DESC LIMIT 4" Só não sei se o relacionamente é este mesmo "article", mas a idiea é. Compartilhar este post Link para o post Compartilhar em outros sites
Clear 0 Denunciar post Postado Dezembro 28, 2011 Olá Andrey ! Já fiz sim, olha os eguinte: "SELECT p.nodeid, p.contentid p.publishdate, p.url, c.categoryid, c.nodeid, a.previewimage, a.contentid, e.title FROM `node` AS p INNER JOIN `nodecategory` AS c ON p.`nodeid` = c.`nodeid` INNER JOIN `article` AS a ON p.`contentid` = a.`contentid` INNER JOIN `nodeinfo` AS e ON p.`nodeid` = e.`nodeid` WHERE c.`categoryid` IN (73,74,77,105,71,70,72,76,100,80,79,78,81,108,145,146,82,142,83,97,153) AND c.`categoryid` NOT IN 158 GROUP BY c.nodeid ORDER BY p.`publishdate` DESC LIMIT 4"; Ele não funciona.... pois digamos que a matéria entitulada "Feliz Natal !" esteja atrelada a 3 categorias: 70, 145, 158. No select acima, ele vai ignorar a linha onde a categoria é 158, porém trará a matéria nas outras 2 categorias que não estão bloqueadas. =/ Abraço Olá Motta ! Infelizmente sem efeito no resultado... SELECT p.nodeid, p.contentid, c.categoryid, c.nodeid, a.previewimage, a.contentid, e.title FROM `node` AS p INNER JOIN `nodecategory` AS c ON p.`nodeid` = c.`nodeid` INNER JOIN `article` AS a ON p.`contentid` = a.`contentid` INNER JOIN `nodeinfo` AS e ON p.`nodeid` = e.`nodeid` WHERE c.`categoryid` IN (73,74,77,105,71,70,72,76,100,80,79,78,81,108,145,146,82,142,83,97,153) AND NOT EXISTS (SELECT null FROM `nodecategory` AS c2 WHERE c2.`categoryid` = c.`categoryid` AND c2.`categoryid` = 158) GROUP BY c.nodeid ORDER BY p.`publishdate` DESC LIMIT 4 Ajustei o código que você forneceu para atender a tabela que faz o relacionamento da categoria. Mas não entendi o conceito, pois eu não tenho nenhum campo null nesta tabela...na verdade em nenhuma delas =/ Abração Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Dezembro 28, 2011 Certo, vamos entender a coisa então, você tem um artigo que pode estar em X categorias, tais como 70 , 60 , 150 , só que você quer um artigo que não esteja em uma determinada categoria Y , então este também não deve estar em 70 e 60 ? Compartilhar este post Link para o post Compartilhar em outros sites
Clear 0 Denunciar post Postado Dezembro 28, 2011 Teoricamente sim Andrey, mas o meu problema é que a única categoria que eu tenho certa para excluir é a '150', mas o artigo sempre virá no SELECT amarrado pelas outras categorias que ele estiver atrelado. +----------+------------+ | nodeid | categoryid | +----------+------------+ | 1 | 150 | | 1 | 70 | | 1 | 60 | +----------+------------+ Dai não sei como fazer essa associação, para ele identificar o NODEID da linha onde ele encontrar o CATEGORYID = 150, e a partir daí retirar da seleção todos as outras linhas que existirem com o mesmo NODEID. Não tenho certeza se consigo fazer isso via SELECT, ou se terei que tratar o resultado em PHP ( o q aí eu terei mais dificuldade...rsssss). Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Dezembro 28, 2011 Cara .. tenta assim SELECT p.nodeid, p.contentid, p.publishdate, p.url, c.categoryid, c.nodeid, a.previewimage, a.contentid, e.title FROM `node` AS p INNER JOIN `nodecategory` AS c ON p.`nodeid` = c.`nodeid` INNER JOIN `article` AS a ON p.`contentid` = a.`contentid` INNER JOIN `nodeinfo` AS e ON p.`nodeid` = e.`nodeid` WHERE c.`categoryid` IN (73,74,77,105,71,70,72,76,100,80,79,78,81,108,145,146,82,142,83,97,153) AND NOT EXISTS ( SELECT 1 FROM `nodecategory` AS ic WHERE p.`nodeid` = ic.`nodeid` AND ic.`categoryid` IN (150) ) GROUP BY c.nodeid ORDER BY p.`publishdate` DESC LIMIT 4 Compartilhar este post Link para o post Compartilhar em outros sites
Clear 0 Denunciar post Postado Dezembro 28, 2011 Andrey funcionou !!! eu acho rssss... Mas tem duas coisas que não entendi direito no seu código (óbvio, pq sou uma besta), o uso do NOT EXISTS ainda é uma incógnita pra mim...li e reli varios artigos sobre ele e não consegui entender direito. A outra dúvida é sobre o SELECT 1, o que ele faz? Mas de qq forma obrigado por toda a ajuda. Abração Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Dezembro 28, 2011 Vixi cara .. eu sou a pessoa menos indicada pra te explicar isso, tem umas 'especialidades' que você vai precisar entender antes .. http://dev.mysql.com/doc/refman/5.0/en/exists-and-not-exists-subqueries.html Não é que eu não queira te explicar, é que minha didática é péssima mesmo haha Que bom que resolveu, abraços ! Compartilhar este post Link para o post Compartilhar em outros sites
Clear 0 Denunciar post Postado Dezembro 28, 2011 AHAHAHAHA tem problema não meu amigo...de qq forma muito obrigado a você e ao Motta pela atenção dispensada ao meu problema. Grande Abraço. Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Dezembro 28, 2011 A ideia do select null e poupar recursos poi o select é apenas para verificar e existência do registro, não para trazer dados, o Andrey Knupp fez isto com um SELECT 1. Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Dezembro 28, 2011 De certa forma sim Motta, mas a chave pra isso ainda não é bem aí, não ao meu ver pois podemos ter uma tabela com mil registros, da mesma forma que aplicamos o 'null' ou '1', na expressão, esse valor se repete, trata-se mais do que você disse, não selecionar algo que não será exibido ou esperado como retorno, apesar de que, a ideia central é o NOT EXISTS. Compartilhar este post Link para o post Compartilhar em outros sites