Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Clear

Não trazer uma linha do DB....com 4 Tabelas !

Recommended Posts

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

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

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

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

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

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

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

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.