Ir para conteúdo

POWERED BY:

Arquivado

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

Cesão

Where dinâmico

Recommended Posts

Olá amigos,

 

Meu problema pe o seguinte: tenho uma tabela de categorias no meu db e uma tabela de noticias. existe tbm uma tabela para relacionar as noticias com as categorias, ja que cada noticia pode ter varias categorias. daí estou tentando mostrar uma noticia e embaixo dela as noticias relacionadas (por categorias).

 

TB_NOTICIAS

  • id
  • titulo

TB_CATEGORIAS

  • id
  • categoria

TB_RELACIONAMENTO

  • id_noticia
  • id_categoria

na pagina da noticia eu mostrei a ultima noticia inserida no banco. dai embaixo da noticia eu listo as categorias relacionadas aquela noticia, fazendo um select (recordset = RS) mostrando todas as categorias que possuem o ID daquela noticia. ateh ai beleza. dai agora eu preciso mostrar as noticias relacionadas aquelas mesmas categorias, mas o problema é: como fazer esse select? ate agora está assim:

 

SQL = "SELECT a.ID, a.TITULO FROM TB_NOTICIAS a LEFT OUTER JOIN TB_RELACIONAMENTO b ON a.ID=b.ID_NOTICIA WHERE b.ID_CATEGORIA="&RS("ID")

nesse select eu relaciono a tabela de noticias com a de relacionamento e falo que o id da categoria tem que ser igual ao id das categorias listadas acima (WHERE b.ID_CATEGORIA="&RS("ID")&"). agora o problema é que ele soh mostra as noticias relacionadas à primeira categoria da lista, mas queria que ele mostrasse as noticias relacionadas a todas as categorias.. por exemplo, vamos dizer que a primeira noticia fale de futebol, volei e basquete. dai embaixo queria mostrar todas as noticias de futebol, todas de volei e todas de basquete, mas ele está mostrando apenas as de futebol.. como tem que ficar meu select para ele pegar todas as noticias relacionadas a todas as categorias?

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, nao sei se você entendeu, mas nao eh isso que eu to perguntando... o ID ja está na pagina. o problema nao eh achar um ID.. sao VARIOS ids.. o que eu preciso eh saber como comparar varias noticias com varias categorias e lista-las.

 

tenho varias categorias listadas no começo. e quero listar todas as noticias relacionadas a todas as categorias embaixo. de uma lida certinho no meu primeiro post que você vai entender.

Compartilhar este post


Link para o post
Compartilhar em outros sites

estou precisando de isso urgente. se alguém puder me ajudar, agradeço.

 

aí em cima é um sistema de noticias relacionadas por tags. é como em blogs... quando você está em um blog, você consegue ver as tags de cada post. quando você clica numa tag, você ve todas as noticias relacionadas Àquela tag.. até aí beleza.. mas queria era relacionar as noticias através de todas as tags que a noticia principal tem. por exemplo, se você está lendo uma noticia com as tags futebol, volei e basquete, gostaria que embaixo ficassem relacionadas todas as noticias que possuissem estas tags tbm. nao necessariamente aquelas possuem essas 3 tags, mas todas as que possuem futebol na sua relação de tags, as que possuem basquete e as que possuem volei.. entenderam?

 

alguém?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você precisa de uma tabela que faça a relação entre as categorias para fazer isso que você quer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas eu já tenho uma tabela que relaciona as tags com as notícias. Dê uma olhada la em cima na minha estrutura de tabelas. Gostaria de saber como fazer agora para ele relacionar com todas as tags passadas. vamos dizer que as tags passadas sejam a 1, a 3 e a 9.. agora, minha string para tentar relacionar as noticias correspondentes está assim:

 

SQL = "SELECT a.ID_NOTICIA, a.DAT_CREATED, a.TXT_TITULO FROM TBL_NOTICIAS a LEFT OUTER JOIN TBL_NOTICIAS_TAGS b ON a.ID_NOTICIA=b.ID_NOTICIA WHERE b.ID_TAG="&TB("ID_TAG")&" AND NOT a.ID_NOTICIA="&UID&" ORDER BY a.DAT_CREATED DESC"

Até agora ele relaciona apenas à primeira tag passada, no caso, a 1. Eu queria que mostrasse todas as notícias que possuem as tags mostradas lá em cima (1, 3 e 9), e não só as que possuem a tag 1.

 

O que eu quero é como se minha string fosse assim no final: WHERE (b.ID_TAG=1 or b.ID_TAG=3 or b.ID_TAG=9) AND NOT a.ID_NOTICIA=1 entenderam? é como se repetisse todas as tags na string, mas não sei como fazer isso acontecer na string. Não sei fazer nem da maneira que passei acima, mas se alguém souber a maneira correta ou mais inteligente de fazer isso que passei, melhor ainda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Altera isso:

WHERE b.ID_TAG="&TB("ID_TAG")&"

 

Para isso:

WHERE b.ID_TAG IN ("&TB("ID_TAG")&")

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu na mesma na verdade, pois ele pega apenas a primeira tag.

ficou tipo WHERE b.ID_TAG IN (1).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei que a ID_TAG armazenava com vírgula.

 

Tenta isso:

SQL = "SELECT a.ID_NOTICIA, a.DAT_CREATED, a.TXT_TITULO "&_
	  "FROM TBL_NOTICIAS a LEFT OUTER JOIN TBL_NOTICIAS_TAGS b ON a.ID_NOTICIA=b.ID_NOTICIA "&_
	  "WHERE b.ID_TAG IN (SELECT b.ID_TAG "&_
						   "FROM TBL_NOTICIAS a LEFT OUTER JOIN TBL_NOTICIAS_TAGS b ON a.ID_NOTICIA=b.ID_NOTICIA "&_
						   "ORDER BY a.DAT_CREATED DESC) AND NOT a.ID_NOTICIA="&UID&" "&_	  
	  "ORDER BY a.DAT_CREATED DESC"

Se não der certo, posta seu código... não a SQL, mas o código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, não deu certo o que você passou. deu o mesmo resultado, como se estivesse pegando apenas 1 tag. Meu código vai abaixo:

 

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Jornal</title>
</head>
<%
UID = Request("UID")
sessao = Request("sessao")

Set DB = Server.CreateObject("ADODB.Connection")
DB.Open Conn
Set TB = Server.CreateObject("ADODB.RecordSet")
Set TBR = Server.CreateObject("ADODB.RecordSet")

If sessao <> "" Then
	SQLL = SQLL & " AND b.TXT_SESSAO='"&sessao&"' ORDER BY a.DAT_CREATED DESC"
Else
	SQLL = SQLL & " AND a.ID_NOTICIA="&UID&""
End If
SQL = "SELECT TOP 1 a.ID_NOTICIA, a.TXT_TITULO, a.TXT_CHAMADA, a.TXT_FONTE, a.ID_AUTOR, a.DAT_CREATED, a.DAT_UPDATED, a.ID_SESSAO, b.ID_SESSAO, b.ID_TIPO, c.ID_TIPO, c.ID_CATEGORIA, d.ID_CATEGORIA, a.TXT_DESCRICAO "_
	& " FROM TBL_NOTICIAS a "_
	& " LEFT OUTER JOIN TBL_NOTICIAS_SESSOES b ON a.ID_SESSAO = b.ID_SESSAO "_
	& " LEFT OUTER JOIN TBL_NOTICIAS_TIPOS c ON b.ID_TIPO = c.ID_TIPO "_
	& " LEFT OUTER JOIN TBL_NOTICIAS_CATEGORIAS d ON c.ID_CATEGORIA = d.ID_CATEGORIA "_
	& " WHERE c.ID_TIPO=1 AND d.ID_CATEGORIA=1 AND a.BIT_ACTIVE=1 AND a.BIT_VISIBLE=1 "&SQLL&""
TB.Open SQL, Conn
%>
<body>
<div id="site">
	
	<!-- BEGIN CONTEÚDO -->
	<div id="conteudo">
		<%If TB.EOF = TRUE Then%>
			<p>Nenhuma notícia encontrada!</p>
		<%Else%>
			<%id_mainnew = TB("ID_NOTICIA")%>
			<p class="data-stamp"><%=FormatoDataHora(TB("DAT_CREATED"))%><%If TB("DAT_UPDATED") <> "" Then%> - Atualizado em <%=FormatoDataHora(TB("DAT_UPDATED"))%><%End If%></p>
			<h2><%=TB("TXT_TITULO")%></h2>
			<p class="chamada"><%=TB("TXT_CHAMADA")%></p>
			<%=TB("TXT_DESCRICAO")%>
			<%
			TB.Close
			SQL = "SELECT a.ID_TAG, a.ID_NOTICIA, b.ID_TAG, b.TXT_TAG FROM TBL_NOTICIAS_TAGS a LEFT OUTER JOIN TBL_TAGS b ON a.ID_TAG=b.ID_TAG WHERE a.ID_NOTICIA="&id_mainnew
			TB.Open SQL, Conn
			%>
			<%
			do while not TB.EOF
				SQL = "UPDATE TBL_TAGS SET BIT_HITS = BIT_HITS + 1 WHERE ID_TAG="&TB("ID_TAG")
				'Response.Write SQL &"<br>"
				'DB.Execute SQL
			TB.movenext : loop : TB.movefirst
			%>
			<%do while not TB.EOF%><a href="tag/<%=TB("TXT_TAG")%>" title="<%=TB("TXT_TAG")%>"><%=TB("TXT_TAG")%></a> | <%TB.movenext : loop : TB.movefirst%>
			<br class="clear" />
			<hr />
			<%
			If sessao <> "" Then
				SQL = "SELECT TOP 3 a.ID_NOTICIA, a.DAT_CREATED, a.TXT_TITULO FROM TBL_NOTICIAS a LEFT OUTER JOIN TBL_NOTICIAS_SESSOES b ON a.ID_SESSAO=b.ID_SESSAO WHERE b.TXT_SESSAO='"&sessao&"' AND NOT a.ID_NOTICIA="&id_mainnew&" ORDER BY a.DAT_CREATED DESC"
			Else
				SQL = "SELECT TOP 3 a.ID_NOTICIA, a.DAT_CREATED, a.TXT_TITULO "_
					  & " FROM TBL_NOTICIAS a LEFT OUTER JOIN TBL_NOTICIAS_TAGS b ON a.ID_NOTICIA=b.ID_NOTICIA "_
					  & " WHERE b.ID_TAG IN (SELECT b.ID_TAG "_
					& " FROM TBL_NOTICIAS a LEFT OUTER JOIN TBL_NOTICIAS_TAGS b ON a.ID_NOTICIA=b.ID_NOTICIA "_
					& " ORDER BY a.DAT_CREATED DESC) AND NOT a.ID_NOTICIA="&id_mainnew&" "_	  
					  & " ORDER BY a.DAT_CREATED DESC"
				SQL = "SELECT TOP 3 a.ID_NOTICIA, a.DAT_CREATED, a.TXT_TITULO FROM TBL_NOTICIAS a LEFT OUTER JOIN TBL_NOTICIAS_TAGS b ON a.ID_NOTICIA=b.ID_NOTICIA WHERE b.ID_TAG IN ("&TB("ID_TAG")&") AND NOT a.ID_NOTICIA="&id_mainnew&" ORDER BY a.DAT_CREATED DESC"
			End If
			TBR.Open SQL, Conn
			%>
			<%If TBR.EOF = FALSE Then%>
			<div id="relacionadas">
				<h4>notícias relacionadas</h4>
				<ul>
					<%do while not TBR.EOF%>
					<li>
					<a href="noticias.asp?UID=<%=TBR("ID_NOTICIA")%>">
					<p><%=FormatoData(TBR("DAT_CREATED"))%></p>
					<p><%=TBR("TXT_TITULO")%></p>
					</a>
					</li>
					<%TBR.movenext : loop : TBR.Close%>
				</ul>
			</div>
			<%End If%>
		<%End If%>
	</div>
	<!-- END CONTEÚDO -->
</div>
</body>
</html>
<%
Set TB = Nothing
Set TBR = Nothing
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de analisar seu código, teste alterando LEFT OUTER JOIN por INNER JOIN

SQL = "SELECT a.ID_NOTICIA, a.DAT_CREATED, a.TXT_TITULO "&_
	  "FROM TBL_NOTICIAS a LEFT OUTER JOIN TBL_NOTICIAS_TAGS b ON a.ID_NOTICIA=b.ID_NOTICIA "&_
	  "WHERE b.ID_TAG IN (SELECT b.ID_TAG "&_
						   "FROM TBL_NOTICIAS a INNER JOIN TBL_NOTICIAS_TAGS b ON a.ID_NOTICIA=b.ID_NOTICIA "&_
						   "ORDER BY a.DAT_CREATED DESC) AND NOT a.ID_NOTICIA="&UID&" "&_	  
	  "ORDER BY a.DAT_CREATED DESC"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade, na tentativa com left outer join e inner join, deu esse erro

 

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified.

Compartilhar este post


Link para o post
Compartilhar em outros sites

acho que consegui.. até agora não deu nenhuma falha, mas vou fazer mais testes p ver se esta string funciona corretamente:

 

SQL = "SELECT DISTINCT a.ID_NOTICIA, a.DAT_CREATED, a.TXT_TITULO "_
					  & " FROM TBL_NOTICIAS a LEFT OUTER JOIN TBL_NOTICIAS_TAGS b ON a.ID_NOTICIA=b.ID_NOTICIA "_
					  & " WHERE NOT a.ID_NOTICIA="&id_mainnew&" AND b.ID_TAG IN (SELECT ID_TAG FROM TBL_NOTICIAS_TAGS WHERE ID_NOTICIA="&id_mainnew&") "_	  
					  & " ORDER BY a.DAT_CREATED DESC"

ah, mais uma observação.. coloquei um distinct ali no primeiro select. para nao repetir as noticias que se relacionam em mais de 1 tag.

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.