Good 4 Denunciar post Postado Julho 14, 2014 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 DESCA 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
lokaodomau 61 Denunciar post Postado Julho 15, 2014 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
Good 4 Denunciar post Postado Julho 15, 2014 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
lokaodomau 61 Denunciar post Postado Julho 15, 2014 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
Good 4 Denunciar post Postado Julho 21, 2014 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
lokaodomau 61 Denunciar post Postado Julho 22, 2014 Uma query muito mais simples. Muito bom! Compartilhar este post Link para o post Compartilhar em outros sites