none
Ordernação 2 tabelas RRS feed

  • 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

    quinta-feira, 11 de setembro de 2008 16:48

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 Snippet

    CREATE 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 UltimaData

    FROM Topico AS T

    LEFT OUTER JOIN Resposta AS R

    ON T.Topico = R.Topico

    WHERE T.Ativo = 1

    GROUP 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.Texto

    FROM Topico AS T

    INNER JOIN UltimasRespostas AS UR ON T.Topico = UR.Topico

    LEFT OUTER JOIN Resposta AS R

    ON UR.Topico = R.Topico AND UR.UltimaData = R.Data)

    SELECT * FROM Resultados

    ORDER BY CASE WHEN RespostaTexto IS NULL THEN 1 ELSE 0 END, RespostaTexto

     

     

    [ ]s,

     

    Gustavo

    sexta-feira, 12 de setembro de 2008 23:36

Todas as Respostas

  • Boa Tarde,

     

    Você poderia postar a estrutura das tabelas ?

    Qual é o seu SQL Server ?

    Se dois tópicos forem respondidos, qual será o outro critério de ordenação ?

     

    [ ]s,

     

    Gustavo

    quinta-feira, 11 de setembro de 2008 17:20
  •  

     

    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 Desc

     

    Se 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

    sexta-feira, 12 de setembro de 2008 01:55
  • Boa Noite,

     

    Tente o seguinte:

     

    Code Snippet

    Select T.idtopico, T.autor, T.titulo, T.data, T.texto

    from topico T Left Join resposta R

    On T.idtopico = R.topico

    Where T.ativo = 1

    Order By CASE WHEN T.data IS NULL THEN 1 ELSE 0 END, T.Data ASC

     

     

    [ ]s,

     

    Gustavo

    sexta-feira, 12 de setembro de 2008 03:38
  • Maia,

     

    ´Também não vejo outra solução e não ser esta utilizar o case no Order By!!!

    sexta-feira, 12 de setembro de 2008 11:28
  • Opa blz, so uma coisa aqui no order by tem q ser o R.data, pq eu quero ordernar pela data de resposta.

     

    Code Snippet

    Select T.idtopico, T.autor, T.titulo, T.data, T.texto

    from topico T Left Join resposta R

    On T.idtopico = R.topico

    Where T.ativo = 1

    Order By CASE WHEN R.data IS NULL THEN 1 ELSE 0 END, R.Data ASC

     

     

    e um problema mesmo eu fazendo assim, ele esta listando varios topicos com duplicidade, com resolver isto?

    Obrigado

    sexta-feira, 12 de setembro de 2008 14:11
  • Bom Dia,

     

    Tente o seguinte:

     

    Code Snippet

    Select DISTINCT T.idtopico, T.autor, T.titulo, T.data, T.texto

    from topico T Left Join resposta R

    On T.idtopico = R.topico

    Where T.ativo = 1

    Order By CASE WHEN R.data IS NULL THEN 1 ELSE 0 END, R.Data ASC

     

     

    [ ]s,

     

    Gustavo

    sexta-feira, 12 de setembro de 2008 14:48
  •  

    Ola, boa tarde, ele deu 2 erros:

     

    Code Snippet

    Msg 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.

     

     

     

    sexta-feira, 12 de setembro de 2008 15:43
  • Boa Tarde,

     

    Tente o seguinte:

     

    Code Snippet

    WITH 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 Ordem

    from topico T Left Join resposta R

    On T.idtopico = R.topico

    Where T.ativo = 1)

     

    SELECT

    idtopico, autor, titulo, data, texto

    FROM Cons

    ORDER BY Ordem, Data

     

     

    [ ]s,

     

    Gustavo

     

    sexta-feira, 12 de setembro de 2008 16:21
  • 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

     

    sexta-feira, 12 de setembro de 2008 18:51
  • Olá Tiago,

     

    Tente assim:

     

    Code Snippet

    WITH Cons AS (

    Select T.idtopico, T.autor, T.titulo, T.data,

    CAST(T.texto AS VARCHAR(MAX)) As Texto

    from topico T Left Join resposta R

    On T.idtopico = R.topico

    Where T.ativo = 1)

    SELECT

    idtopico, autor, titulo, MAX(data) AS UltimaData, texto

    FROM Cons

    GROUP BY idtopico, autor, titulo, texto

    ORDER BY UltimaData

     

     

    Se não funcionar, poste alguns registros para a gente simular a situação.

     

    [ ]s,

     

    Gustavo

     

    sexta-feira, 12 de setembro de 2008 19:05
  •  

    Opa ainda não foi, vou colocar aqui alguns registros:

     

    Tabela Topico

     

    Code Snippet

    Insert 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 Snippet

    Insert 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

    sexta-feira, 12 de setembro de 2008 20:15
  • 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 Snippet

    CREATE 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 UltimaData

    FROM Topico AS T

    LEFT OUTER JOIN Resposta AS R

    ON T.Topico = R.Topico

    WHERE T.Ativo = 1

    GROUP 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.Texto

    FROM Topico AS T

    INNER JOIN UltimasRespostas AS UR ON T.Topico = UR.Topico

    LEFT OUTER JOIN Resposta AS R

    ON UR.Topico = R.Topico AND UR.UltimaData = R.Data)

    SELECT * FROM Resultados

    ORDER BY CASE WHEN RespostaTexto IS NULL THEN 1 ELSE 0 END, RespostaTexto

     

     

    [ ]s,

     

    Gustavo

    sexta-feira, 12 de setembro de 2008 23:36
  •  

    Ao irmão, agora foi, dei um trabalhinho aeh heim

    brigadão, so um detalhe na parte final.

     

    Code Snippet

    ORDER BY CASE WHEN RespostaTexto IS NULL THEN 1 ELSE 0 END, RespostaTexto Desc

     

     

    eu coloquei um desc, aeh fechou mesmo, vlw cara
    sábado, 13 de setembro de 2008 17:05
  • Oi Tiago,

     

    Que canseira (rs). Essa Thread já estava me incomodando hehehehe.

    Que bom que agora ela lhe atendeu.

     

    [ ]s,

     

    Gustavo

     

    domingo, 14 de setembro de 2008 00:56
  •  

    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 Snippet

    Msg 8158, Level 16, State 1, Line 3

    'Resultados' has more columns than were specified in the column list.

     

     

     

    Obrigado
    segunda-feira, 15 de setembro de 2008 14:39
  • 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

    segunda-feira, 15 de setembro de 2008 16:50
  • Opa deu certo, brigadão

     

    segunda-feira, 15 de setembro de 2008 22:08