Ir para conteúdo

Arquivado

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

Marcelo Garbin

Mensagens entre usuários ordenadas por Data de Resposta

Recommended Posts

Buenas pessoal, tudo certo?

 

Tenho uma dúvida referente a visualização de registros, estou fazendo um sisteminha com troca de mensagens, como por exemplo um helpdesk, a minha dúvida é referente a ordenação da mesmas.

Tenho uma tabela com as mensagens de um usuário padrão e outra tabela com as respostas feitas pelo admin para esse usuário.

 

Minha dúvida é como posso fazer para buscar essas mensagens e verificar se uma data é maior que a outra, se for colocar logo abaixo da anterior.

Por exemplo:

- Usuário cadastro uma mensagem.

- Admin respondeu a mensagem.

- Usuário cadastro uma mensagem.

- Usuário cadastro uma mensagem.

- Admin respondeu a mensagem.

 

Por aí em diante...

 

Alguma dica? lembrando que tenho 2 tabelas, teria que cruzar esses dados para ordenalos, o que posso usar para isso?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ordenar pelo timestamp, e a primeira msg tem que ser parent_id = 0

As demais com as IDs da mensagem parent_id = id

para ordenar

order by parent_id asc, timestamp asc

Ps.: Duas tabelas para tickets não há necessidade, só uma da conta!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ordenar pelo timestamp, e a primeira msg tem que ser parent_id = 0

 

As demais com as IDs da mensagem parent_id = id

 

para ordenar

order by parent_id asc, timestamp asc

Ps.: Duas tabelas para tickets não há necessidade, só uma da conta!

 

Eaí Williams, tudo certo? Obrigado pela resposta.

 

Pois então, pensei em fazer somente uma tabela mesmo, como você falou, porém tem a questão de salvar o id do usuário. Tenho 2 tabelas, 1 para usuário padrão do sistema e 1 somente para administradores do sistema. Nesse caso se eu salvar em apenas uma tabela as mensagens provavelmente dara conflito com as id's, pois tenho id's repetidas para usuários diferentes(dessas 2 tabelas).

 

Também pensei na questão do timestramp que acredito que seja o mais correto, porém a minha dúvida fica na montagem da comparação das datas entre as 2 tabelas, nesse caso devo usar um while?

Exemplo, o usuário padrão mandou 4 mensagens e o admin mandou apenas 2, sendo que essas 2 estão entre o meio das 4, (da pra entender? hehehe).

Como posso comparar essas datas(2 laços talvez?) e montar o resultado final? Pensei em talvez pegar os dados e após a comparação montar um array p/ posteriormente escreve-los todos na tela...

 

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nesse caso se eu salvar em apenas uma tabela as mensagens provavelmente dara conflito com as id's, pois tenho id's repetidas para usuários diferentes(dessas 2 tabelas).

Já tem erro de modelagem ai, duas tabelas de usuarios! Default e Admin

 

Diante desta situação, é só criar um Join para unir as tabelas e filtrar pelo id´s

 

Mesmo assim ainda há possibilidade de se fazer em uma só table, vai facilitar nas buscas usando um full text por exemplo, no corpo e titulo.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Partindo do princípio de que é impossível enviar uma mensagem antes da outra, sem que essa tenha realmente ocorrido antes.

Eu ordenaria pelo ID DA MENSAGEM, muito mais rápido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já tem erro de modelagem ai, duas tabelas de usuarios! Default e Admin

 

Diante desta situação, é só criar um Join para unir as tabelas e filtrar pelo id´s

 

Mesmo assim ainda há possibilidade de se fazer em uma só table, vai facilitar nas buscas usando um full text por exemplo, no corpo e titulo.

 

 

Acredito que não seja erro de modelagem, pois guardo dados diferentes e de diferentes usuários. Um exemplo é uma tabela Colaboradores e outra Usuários, sendo que eu não sou necessariamente um colaborador, mas sim um administrador do sistema, logo se encaixaria na de Usuários, mas esse é outro caso.

 

Pois então, hoje não retornei mais ao projeto, mas vou ver amanhã, na verdade fiz 2 métodos 1 para buscar as respostas e outro para as mensagens do usuários. Vou pegar a sua ideia e juntar as duas tabelas com join e ordenar pela data, pois pelas id's como são duas tabelas irá se repetir e não irá ordenar.

 

Caso contrário, farei apenas uma tabela pra agilizar hehehe..

 

Mais uma vez obrigado.

 

Partindo do princípio de que é impossível enviar uma mensagem antes da outra, sem que essa tenha realmente ocorrido antes.

Eu ordenaria pelo ID DA MENSAGEM, muito mais rápido.

Certo, mas isso com apenas uma única tabela, ok? Se não conseguir da forma que quero, vou fazer dessa, menos dor de cabeça. Só gostaria de fazer com as duas pra deixar separado o que é do usuário e o que é do administrador. Vou decidir amanhã o que é melhor, vocês estão me convencendo em fazer com uma única tabela mesmo! kkkkkk

 

Obrigado pelo help!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fazer em 2 tabelas é um erro de modelagem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fazer em 2 tabelas é um erro de modelagem.

Então William, estou me baseando pelas tabelas do osTicket, talvez eu esteja modelando errado meu banco então.

 

O correto seria apenas uma tabela com as mensagens?

 

Da uma conferida como esta as tabelas do osTicket de mensagem, resposta e ticket.

img_36_Mar_10_11_11.jpg

 

Que me diz? Talvez eu tenha entendido errado esse modelo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dependendo do intuito de cada tabela, pode ou não haver duas tabelas. Se for apenas para trocas de mensagens, uma tabela é mais que o suficiente.

 

Mas, por exemplo, eu um sistema que foi modelado na nossa empresa, existem duas tabelas de mensagens para cada chamado, sendo uma tabela para as respostas de um questionário dinâmico na hora da abertura do chamado e outra para a troca de mensagens entre o solicitante e o atendente.

 

Só que, ao meu ver, no escopo acima, a modelagem parece estar um pouco equivocada sim.

Aonde encontro a modelagem completa?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguindo essa sua modelagem aí, na tabela ost_ticket existe os campos para preencher com a data da última mensage/response, seria só implementar isso e ordenar por essas datas.

Porém, acho que você quer uma SQL que ordene os tickets usando os campos created das respectivas tabelas, certo?

Acho que seria uma SQL mais ou menos assim:

SELECT * FROM ost_ticket t
LEFT JOIN ost_ticket_message m ON m.ticket_id = t.ticket_id
LEFT JOIN ost_ticket_response r ON r.ticket_id = t.ticket_id
GROUP BY t.ticket_id
ORDER BY if(r.response_id is not null and max(r.created) > max(m.created), max(r.created), if(m.message_id is not null, max(m.created), t.created)) DESC;


O order by ficou um pouco extenso, mas é porque não sei se sempre vai existir um registro na tabela message, se sempre existir da pra tirar a segunda condição e pegar sempre o valor da tabela message.

Até mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Buenas pessoal,

Obrigado pela ajuda de todos aí, ontem não pude ver, é foda trabalhar com Suporte de TI e tentar ser Programador ao mesmo tempo! rsrsrs...

Resolvi da seguinte forma, fiquei utilizando as 2 tabelas, justamente para separar as ID's dos usuários, pois como havia falado anteriormente, foi utilizado uma tabela para colaborador e outra para administradores.

Fiz tudo via SQL mesmo, utilizei os seguintes operadores: SELECT, LEFT JOIN, WHERE, UNION ALL e ORDER BY.
(Lembrando que para usar o UNION ou UNION ALL, a quantidade de campos deve ser iguais nos 2 SELECT)

Exemplo:

(SELECT campos_da_tabela1 FROM tabela1 t1 LEFT JOIN outra_tabela ot ON t1.id_user=ot_id_user WHERE t1.id_tabela=valorX)
UNION ALL
(SELECT campos_da_tabela2 FROM tabela2 t2 LEFT JOIN outra_tabela ot ON t2.id_user=ot_id_user WHERE t2.id_tabela=valorX)
ORDER BY data

Dessa forma consegui pegar todas as mensagens das duas tabelas que pussuem as mesmas ID's em sequencia de data.

Como estou utilizando o CodeIgniter 2 com Active Record, o mesmo não possui o UNION, dessa forma usei como exemplo para montar minha query neste site: Perform Union operation using active record class

 

Qualquer sugestão de melhoria estou aberto para ouvir e se alguém tiver a mesma dúvida deste tópico posso ajudar!

 

Obrigado a todos. :joia:

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.