Usuário com melhor resposta
Ordernação 2 tabelas

Pergunta
-
Ola galera, blz?
estou com um pequeno problema, tem uma tabela chamada topico que quando cria o topico, eu insiro os dados nela
e tenho uma tabela chamada resposta que tem os dados de resposta de todos os topicos
estou tentando fazer uma listagem aonde tem todos os topicos, mais a ordenação dela, tem q ser de acordo com a tabela de resposta, por exemplo eu crio o topico 1, e o topico 2, se eu responder o topico 2 ele vai ficar acima do topico 1.
como eu posso montar isto, acho que este forum funciona deste jeito, obrigado
Respostas
-
Boa Noite,
Utilizei seus INSERTs, mas eles estão meio inconsistentes (todos referenciam o título de "Tópico 1", além da ordem das colunas estar diferente dos valores passados). Fiz algumas adaptações, faça os testes, mas acho que agora fechou.
Code SnippetCREATE
TABLE Topico (Topico
INT Identity(1,1),Autor
INT, Titulo VARCHAR(80),Texto
TEXT, Data DATETIME, Ativo TINYINT)Insert
Into topico (autor, titulo, texto, data, ativo) Values (1, 'topico 1', 'Galera...vamos fazer o seguinte...em outro tópico...', '2008-09-10 23:16:39', 1)Insert
Into topico (autor, titulo, texto, data, ativo) Values (1, 'topico 2', 'Galera...vamos fazer o seguinte...em outro tópico...', '2008-09-09 23:07:23', 1)Insert
Into topico (autor, titulo, texto, data, ativo) Values (1, 'topico 3', 'este topico não tera respostas ainda', '2008-09-09 22:55:54', 1)Insert
Into topico (autor, titulo, texto, data, ativo) Values (1, 'topico 4', 'Galera...vamos fazer o seguinte...em outro tópico...', '2008-09-09 22:26:39', 1)CREATE
TABLE Resposta (Autor
INT, Topico INT, Titulo VARCHAR(100),Data
DATETIME, Texto TEXT, Ativo TINYINT)Insert
Into resposta (autor, topico, titulo, texto, data, ativo) Values (1, 1, 'resposta topico 1', 'texto...', '2008-09-12 13:21:20', 1)Insert
Into resposta (autor, topico, titulo, texto, data, ativo) Values (1, 1, 'resposta topico 1', 'texto...', '2008-09-12 14:21:20', 1)Insert
Into resposta (autor, topico, titulo, texto, data, ativo) Values (1, 1, 'resposta topico 1', 'texto...', '2008-09-12 15:21:20', 1)Insert
Into resposta (autor, topico, titulo, texto, data, ativo) Values (1, 2, 'resposta topico 1', 'texto...', '2008-09-12 17:21:20', 1)Insert
Into resposta (autor, topico, titulo, texto, data, ativo) Values (1, 4, 'resposta topico 1', 'texto...', '2008-09-12 13:21:20', 1)Insert
Into resposta (autor, topico, titulo, texto, data, ativo) Values (1, 4, 'resposta topico 1', 'texto...', '2008-09-12 13:51:20', 1)Resolução
Code Snippet-- CTE 1
-- Retornar todos os tópicos com resposta mais recente se houver
WITH
UltimasRespostas AS (SELECT
T.Topico, MAX(R.Data) AS UltimaDataFROM
Topico AS TLEFT
OUTER JOIN Resposta AS RON
T.Topico = R.TopicoWHERE
T.Ativo = 1GROUP
BY T.Topico),-- CTE 2
-- Recuperar os textos dos tópicos e as respostas mais recentes se houver
Resultados
(TopicoAutor, TopicoTitulo, TopicoTexto,TopicoData,RespostaAutor
, RespostaTopico, RespostaTitulo, RespostaTexto, RespostaData)AS
(SELECT
T.Autor,T.Titulo,T.Texto, T.Data,R
.Autor,R.Topico,R.Titulo, R.Data,R.TextoFROM
Topico AS TINNER
JOIN UltimasRespostas AS UR ON T.Topico = UR.TopicoLEFT
OUTER JOIN Resposta AS R ON UR.Topico = R.Topico AND UR.UltimaData = R.Data)SELECT
* FROM ResultadosORDER
BY CASE WHEN RespostaTexto IS NULL THEN 1 ELSE 0 END, RespostaTexto[ ]s,
Gustavo
Todas as Respostas
-
-
segue a estrutura das tabelas, meu sql server é o 2005:
Select
T.idtopico, T.autor, T.titulo, T.data, T.texto from topico T Inner Join resposta R On T.idtopico = R.topico Where T.ativo = 1 Order By T.data DescSe eu deixo deste jeito ele traz varios topico com duplicidade, agora se tiver 2 respostas no topico, tem que ordernar pela ultima de postagem
vlww
-
Boa Noite,
Tente o seguinte:
Code SnippetSelect
T.idtopico, T.autor, T.titulo, T.data, T.textofrom
topico T Left Join resposta ROn
T.idtopico = R.topicoWhere
T.ativo = 1Order
By CASE WHEN T.data IS NULL THEN 1 ELSE 0 END, T.Data ASC[ ]s,
Gustavo
-
-
Opa blz, so uma coisa aqui no order by tem q ser o R.data, pq eu quero ordernar pela data de resposta.
Code SnippetSelect T.idtopico, T.autor, T.titulo, T.data, T.texto
from
topico T Left Join resposta ROn
T.idtopico = R.topicoWhere
T.ativo = 1Order
By CASE WHEN R.data IS NULL THEN 1 ELSE 0 END, R.Data ASCe um problema mesmo eu fazendo assim, ele esta listando varios topicos com duplicidade, com resolver isto?
Obrigado
-
Bom Dia,
Tente o seguinte:
Code SnippetSelect
DISTINCT T.idtopico, T.autor, T.titulo, T.data, T.textofrom
topico T Left Join resposta ROn
T.idtopico = R.topicoWhere
T.ativo = 1Order
By CASE WHEN R.data IS NULL THEN 1 ELSE 0 END, R.Data ASC[ ]s,
Gustavo
-
Ola, boa tarde, ele deu 2 erros:
Code SnippetMsg 145, Level 15, State 1, Line 1
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
Msg 421, Level 16, State 1, Line 1
The ntext data type cannot be selected as DISTINCT because it is not comparable.
-
Boa Tarde,
Tente o seguinte:
Code SnippetWITH
Cons AS (Select
DISTINCT T.idtopico, T.autor, T.titulo, T.data,CAST
(T.texto AS VARCHAR(MAX)) As Texto,CASE
WHEN R.data IS NULL THEN 1 ELSE 0 END AS Ordemfrom
topico T Left Join resposta ROn
T.idtopico = R.topicoWhere
T.ativo = 1)SELECT
idtopico
, autor, titulo, data, textoFROM
ConsORDER
BY Ordem, Data[ ]s,
Gustavo
-
Opa Gustavo, agora deu certo cara, brigadão.
So uma coisa que eu reparei, sobre a ordenação parece q falta alguma coisa, tem o topico com o codigo 55, ele tem varias respostas e a ultima foi as: 2008-09-12 13:21:20.340, mais o topico que esta em primeiro é do codigo 51, e a ultima resposta dele foi as: 2008-09-06 15:17:05.857.
E uma duvida no seu primerio select, não teria que fazer um left join, na tabela de respostas, aonde eu pego o ultimo registro de cada topico, deu para entender?
Obrigado
-
Olá Tiago,
Tente assim:
Code SnippetWITH
Cons AS (Select
T.idtopico, T.autor, T.titulo, T.data,CAST
(T.texto AS VARCHAR(MAX)) As Textofrom
topico T Left Join resposta ROn
T.idtopico = R.topicoWhere
T.ativo = 1)SELECT
idtopico
, autor, titulo, MAX(data) AS UltimaData, textoFROM
ConsGROUP
BY idtopico, autor, titulo, textoORDER
BY UltimaDataSe não funcionar, poste alguns registros para a gente simular a situação.
[ ]s,
Gustavo
-
Opa ainda não foi, vou colocar aqui alguns registros:
Tabela Topico
Code SnippetInsert
Into topico (autor, titulo, data, texto, ativo) Values (1, 'topico 1', 'Galera...vamos fazer o seguinte...em outro tópico...', '2008-09-10 23:16:39', 1)Insert
Into topico (autor, titulo, data, texto, ativo) Values (1, 'topico 2', 'Galera...vamos fazer o seguinte...em outro tópico...', '2008-09-09 23:07:23', 1)Insert
Into topico (autor, titulo, data, texto, ativo) Values (1, 'topico 3', 'este topico não tera respostas ainda', '2008-09-09 22:55:54', 1)Insert
Into topico (autor, titulo, data, texto, ativo) Values (1, 'topico 4', 'Galera...vamos fazer o seguinte...em outro tópico...', '2008-09-09 22:26:39', 1)Tabela Respostas
Code SnippetInsert
Into resposta (autor, topico, titulo, data, texto, ativo) Values (1, 1, 'resposta topico 1', 'texto...', '2008-09-12 13:21:20', 1)Insert
Into resposta (autor, topico, titulo, data, texto, ativo) Values (1, 1, 'resposta topico 1', 'texto...', '2008-09-12 14:21:20', 1)Insert
Into resposta (autor, topico, titulo, data, texto, ativo) Values (1, 1, 'resposta topico 1', 'texto...', '2008-09-12 15:21:20', 1)Insert
Into resposta (autor, topico, titulo, data, texto, ativo) Values (1, 2, 'resposta topico 1', 'texto...', '2008-09-12 17:21:20', 1)Insert
Into resposta (autor, topico, titulo, data, texto, ativo) Values (1, 4, 'resposta topico 1', 'texto...', '2008-09-12 13:21:20', 1)Insert
Into resposta (autor, topico, titulo, data, texto, ativo) Values (1, 4, 'resposta topico 1', 'texto...', '2008-09-12 13:51:20', 1)Bom conforme estes registros o Topico numero 2 tem q ser o primeiro.
Obrigado
-
Boa Noite,
Utilizei seus INSERTs, mas eles estão meio inconsistentes (todos referenciam o título de "Tópico 1", além da ordem das colunas estar diferente dos valores passados). Fiz algumas adaptações, faça os testes, mas acho que agora fechou.
Code SnippetCREATE
TABLE Topico (Topico
INT Identity(1,1),Autor
INT, Titulo VARCHAR(80),Texto
TEXT, Data DATETIME, Ativo TINYINT)Insert
Into topico (autor, titulo, texto, data, ativo) Values (1, 'topico 1', 'Galera...vamos fazer o seguinte...em outro tópico...', '2008-09-10 23:16:39', 1)Insert
Into topico (autor, titulo, texto, data, ativo) Values (1, 'topico 2', 'Galera...vamos fazer o seguinte...em outro tópico...', '2008-09-09 23:07:23', 1)Insert
Into topico (autor, titulo, texto, data, ativo) Values (1, 'topico 3', 'este topico não tera respostas ainda', '2008-09-09 22:55:54', 1)Insert
Into topico (autor, titulo, texto, data, ativo) Values (1, 'topico 4', 'Galera...vamos fazer o seguinte...em outro tópico...', '2008-09-09 22:26:39', 1)CREATE
TABLE Resposta (Autor
INT, Topico INT, Titulo VARCHAR(100),Data
DATETIME, Texto TEXT, Ativo TINYINT)Insert
Into resposta (autor, topico, titulo, texto, data, ativo) Values (1, 1, 'resposta topico 1', 'texto...', '2008-09-12 13:21:20', 1)Insert
Into resposta (autor, topico, titulo, texto, data, ativo) Values (1, 1, 'resposta topico 1', 'texto...', '2008-09-12 14:21:20', 1)Insert
Into resposta (autor, topico, titulo, texto, data, ativo) Values (1, 1, 'resposta topico 1', 'texto...', '2008-09-12 15:21:20', 1)Insert
Into resposta (autor, topico, titulo, texto, data, ativo) Values (1, 2, 'resposta topico 1', 'texto...', '2008-09-12 17:21:20', 1)Insert
Into resposta (autor, topico, titulo, texto, data, ativo) Values (1, 4, 'resposta topico 1', 'texto...', '2008-09-12 13:21:20', 1)Insert
Into resposta (autor, topico, titulo, texto, data, ativo) Values (1, 4, 'resposta topico 1', 'texto...', '2008-09-12 13:51:20', 1)Resolução
Code Snippet-- CTE 1
-- Retornar todos os tópicos com resposta mais recente se houver
WITH
UltimasRespostas AS (SELECT
T.Topico, MAX(R.Data) AS UltimaDataFROM
Topico AS TLEFT
OUTER JOIN Resposta AS RON
T.Topico = R.TopicoWHERE
T.Ativo = 1GROUP
BY T.Topico),-- CTE 2
-- Recuperar os textos dos tópicos e as respostas mais recentes se houver
Resultados
(TopicoAutor, TopicoTitulo, TopicoTexto,TopicoData,RespostaAutor
, RespostaTopico, RespostaTitulo, RespostaTexto, RespostaData)AS
(SELECT
T.Autor,T.Titulo,T.Texto, T.Data,R
.Autor,R.Topico,R.Titulo, R.Data,R.TextoFROM
Topico AS TINNER
JOIN UltimasRespostas AS UR ON T.Topico = UR.TopicoLEFT
OUTER JOIN Resposta AS R ON UR.Topico = R.Topico AND UR.UltimaData = R.Data)SELECT
* FROM ResultadosORDER
BY CASE WHEN RespostaTexto IS NULL THEN 1 ELSE 0 END, RespostaTexto[ ]s,
Gustavo
-
-
-
Opa Gustavo, td blz??
Uma duvida aqui como eu faço pra recuperar os campos que eu quero, por exemplo aqui:
Code Snippet-- CTE 2
-- Recuperar os textos dos tópicos e as respostas mais recentes se houver
Resultados
(TopicoAutor, TopicoTitulo, TopicoTexto,TopicoData, RespostaAutor, RespostaTopico, RespostaTitulo, RespostaData, RespostaTexto)Esta trazendo estes campos, e eu queria adicionar o campo do Id do Topico, e retirar os campos RespostaTitulo, RespostaAutor.
Mais se eu retiro isto da um erro:
Code SnippetMsg 8158, Level 16, State 1, Line 3
'Resultados' has more columns than were specified in the column list.
-
Boa Tarde Tiago,
O que ocorre é que ao definir a CTE Resultados, você está especificando que ela terá 9 colunas (TopicoAutor, TopicoTitulo, TopicoTexto,TopicoData, RespostaAutor, RespostaTopico, RespostaTitulo, RespostaData, RespostaTexto) e o SELECT da CTE também tem nove colunas.
Se você deseja retirar colunas, você deve retirar tanto da definição, quanto do SELECT. Pela mensagem de erro, você deve estar retirando da lista de colunas, mas não está retirando do SELECT ou vice-versa.
[ ]s,
Gustavo
-