Ir para conteúdo

Arquivado

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

Good

Verificar última mensagem enviada

Recommended Posts

To fazendo um sistema de chat baseado no do facebook.. a estrutura da tabela é assim:
mensagens { id, uid1, uid2, mensagem, status (0,1), data }
coluna status: o valor 0 significa que não foi lido, e valor 1 significa que foi lido;

Eu consegui fazer uma listagem única de todas as conversas com usuários diferente, a partir da minha ID, através desta query:
SELECT t1.* FROM mensagens AS t1 LEFT JOIN mensagens AS t2 ON ((t1.uid1 = t2.uid1 AND t1.uid2 = t2.uid2) OR (t1.uid1 = t2.uid2 AND t1.uid2 = t2.uid1)) AND t1.id < t2.id WHERE (t1.uid1 = '1' OR t1.uid2 = '1') AND t2.id IS NULL ORDER BY t1.data DESC

A minha dúvida é fazer com que exiba um COUNT de mensagens não lida..
Planejamento que fiz:
id | uid1 (quem envia) | uid2 (quem recebe) | status

66 | 1 | 2 | 1

67 | 2 | 1 | 1

68 | 2 | 1 | 0

69 | 1 | 2 | 0

69 | 1 | 2 | 0

-> Na minha sessão id 1 eu teria 1 mensagem nova.. e na sessão de id 2, teria 2 mensagens novas
Tipo, eu estou logado na minha conta.. A minha ID é 1, então não há como estabelecer que a coluna uid1 sempre terá o valor 1. Aí, minha ideia era fazer um select pra pegar apenas os registros que contenham uid1 ou uid2 diferente da minha sessão e status = 0.

 

Espero que tenham entendido.. obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

O COUNT() não é incrementado com um valor NULL, qualquer outro valor é considerado.

 

Então um [inline]COUNT( IF( `status` = 0, 1, NULL ) )[/inline] deve resolver, claro que nesta consulta deve ter um GROUP BY com o campo que deseja agrupar, por exemplo: uid2. Desta forma, conta quantas mensagens não lidas cada uid2 possui.

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT *, COUNT( IF( `status` = 0, 1, NULL ) ) AS total FROM mensagens WHERE uid1 = '2' OR uid2 = '2' ORDER BY data DESC

assim? :s dá um help aí, pq aquela query ali nem eu sei como fiz..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim:

SELECT t1.id, t1.uid1, t1.uid2, t1.`data`, t1.`status`, COUNT( IF( t1.`status` = 0, 1, NULL ) ) AS total
FROM mensagens AS t1
WHERE
  t1.uid1 = 1 # id de quem envia
GROUP BY t1.uid1, t1.uid2
ORDER BY t1.`data` ASC

O campo uid1 é o id do usuário que está acessando o sistema, agrupando por uid1 e uid2 a consulta conta quantas mensagens com o uid2 não foram lidas, ordenando pelo campo `data`.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pra finalizar hoje este código de mensagens... Vim aqui ler, testei sua query e tal.. tudo ok..

Mas foi até falta de atenção minha, acho que eu tava de cabeça quente.. mas é a coisa mais simples.. Se a uid1 é sempre quem envia, logo a uid2 sempre será quem recebe..

 

então:

SELECT COUNT(*) AS total 
FROM `mensagens` 
WHERE uid2 = '1' #ID DA MINHA CONTA
AND STATUS = '0'
GROUP BY uid1
ORDER BY data ASC

Com GROUP BY, teremos a quantidade de usuários que me enviou novas mensagens..

Se tirar o GROUP BY, teremos o número exato de mensagens novas...

Logo, podemos colocar ORDER BY id... já que a coluna id é de auto incremento;

 

Obrigado \o

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.