Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Diesly Duarte

sistema de notificação

Recommended Posts

Fiz 2 tabela no meu banco de dados, um onde fica as notificações e outro onde guarda quem já visualizou. Não estou conseguindo pegar o número de quantas notificações falta para o usuário ver.

Me ajudem.

Compartilhar este post


Link para o post
Compartilhar em outros sites
DiF    2.722

@Diesly Duarte Olá, seja bem vindo em nosso Clube do Hardware.

 

Como você não postou nenhum código e nem como está modelado o banco de dados, vou partir da premissa de que o banco de dados está com os devidos relacionamentos e índices feitos.

 

No meu ponto de vista, falta uma tabela para você fazer o N:N.

 

O ideal é ter uma tabela para as notificações, uma tabela para status, uma tabela de usuário e a tabela que servirá como N:N entre as outras 3 tabelas.

 

Por exemplo:

usuarios(ID AI PK, usuario)

notificacao(ID AI PK, notificacao)

status(ID AI PK, status)

tbl_controla_notificacao(ID AI PK, ID_usuario FK, ID_notificacao FK, ID_status FK)

 

Esta tabela tbl_controla_notificacao é uma tabela que conterá somente dados numéricos que faz referência aos demais IDs PK das outras tabelas.

 

Ao modo que você consiga acessar os dados com o INNER JOIN.

Com isso, você pode  fazer a contagem com o count()  no campo que precisa.

 

exemplo hipotético:

 

SELECT notificacao.notificacao, 
       status.status, 
       count(tbl_controla_notificacao.ID_status)  
FROM tbl_controla_notificacao
INNER JOIN notificacao ON notificacao.ID = tbl_controla_notificacao.ID_notificacao
INNER JOIN status ON status.ID = tbl_controla_notificacao.ID_status
WHERE  ID_usuarios = 1 AND ID_status = 2

Basicamente, presume-se que o registro do status não visualizado seja 2  e visualizado seja 1

Então a instrução acima imprimiria em tela a notificação, o status dela como não lido e a contagem de quantos ainda não foram lidos.

 

No momento que o usuário ler,  faz um update set na tabela trocando de 2  para 1. 

 

 É por aí a coisa

 

PS: são só exemplos hipotéticos, não funcionarão se copiar, mas pelo menos serve como guia, para você estudar e tentar implementar.

Editado por DiF
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Diesly Duarte    1
  • Autor do tópico
  • 9 horas atrás, DiF disse:

    @Diesly Duarte Olá, seja bem vindo em nosso Clube do Hardware.

     

    Como você não postou nenhum código e nem como está modelado o banco de dados, vou partir da premissa de que o banco de dados está com os devidos relacionamentos e índices feitos.

     

    No meu ponto de vista, falta uma tabela para você fazer o N:N.

     

    O ideal é ter uma tabela para as notificações, uma tabela para status, uma tabela de usuário e a tabela que servirá como N:N entre as outras 3 tabelas.

     

    Por exemplo:

    usuarios(ID AI PK, usuario)

    notificacao(ID AI PK, notificacao)

    status(ID AI PK, status)

    tbl_controla_notificacao(ID AI PK, ID_usuario FK, ID_notificacao FK, ID_status FK)

     

    Esta tabela tbl_controla_notificacao é uma tabela que conterá somente dados numéricos que faz referência aos demais IDs PK das outras tabelas.

     

    Ao modo que você consiga acessar os dados com o INNER JOIN.

    Com isso, você pode  fazer a contagem com o count()  no campo que precisa.

     

    exemplo hipotético:

     

    
    SELECT notificacao.notificacao, 
           status.status, 
           count(tbl_controla_notificacao.ID_status)  
    FROM tbl_controla_notificacao
    INNER JOIN notificacao ON notificacao.ID = tbl_controla_notificacao.ID_notificacao
    INNER JOIN status ON status.ID = tbl_controla_notificacao.ID_status
    WHERE  ID_usuarios = 1 AND ID_status = 2

    Basicamente, presume-se que o registro do status não visualizado seja 2  e visualizado seja 1

    Então a instrução acima imprimiria em tela a notificação, o status dela como não lido e a contagem de quantos ainda não foram lidos.

     

    No momento que o usuário ler,  faz um update set na tabela trocando de 2  para 1. 

     

     É por aí a coisa

     

    PS: são só exemplos hipotéticos, não funcionarão se copiar, mas pelo menos serve como guia, para você estudar e tentar implementar.

    Obrigado por responder.

    Olha, não consegui. Veja como fiz:

     <?php	
    	$sql = "SELECT * FROM hr_notificacao c, hr_notificacao_vist p WHERE p.userid='$iduser' AND p.avid=c.id AND p.lida='sim'";
    	$conecta = mysql_query($sql) or die(mysql_error());
    	$checar = mysql_num_rows($conecta);   
    	if($checar == "0"){
    		echo $checar;
    	}else{
    		$sqle = "SELECT * FROM hr_notificacao c, hr_notificacao_vist p WHERE p.avid=c.id AND p.userid='1' AND p.lida='nao'";
    			$conect = mysql_query($sqle) or die(mysql_error());
    			$checara = mysql_num_rows($conect);
    		echo $checara;
    	}
    ?>

    O problema é que não consigo contar quantos ainda falta para ler.

    Tenho 3 tabela usuário,  hr_notificacao e hr_notificacao_vist.

     

    Editado por Diesly Duarte

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    DiF    2.722

    @Diesly Duarte Sua sql está errada. por gentileza, leia com atenção novamente o exemplo da sql que postei acima.

     

    Você conta os registros com a função COUNT()  dentro do sql.

     

    Uma das regras de normalização diz que é melhor destrinchar o máximo possível suas tabelas em várias outras, fazendo relacionamentos de 1:N ou N:N se precisar.

    Editado por DiF

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    Diesly Duarte    1
  • Autor do tópico
  • @DiF Mano, eu não entendi direito como você me orientou, poderia fazer de um jeito q funcione para mim entender melhor? Agradeço.

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
    DiF    2.722

    Como não é viável que eu faça o seu trabalho vou tentar explicar de forma direta e mais objetiva.

    Primeiro você destrincha suas tabelas em varias. Como por exemplo:

     

    Uma tabela para usuários, uma tabela para notificações, uma tabela para o status( lido ou não lido), uma tabela que irá controlar todo o resto.

     

    Ou seja, esta tabela que vai controlar todo o resto, será uma tabela N:N na qual receberá apenas valores numéricos.

    Estes valores numéricos são chaves estrangeiras ligadas a chaves primárias das outras 3 tabelas.

     

    Fazendo desta forma, você normaliza seu banco de dados respeitando as Formas normais ( 1FN E 2FN) pelo menos.

    Isso evitará inconsistências no seu banco de dados.

     

    Com seu banco de dados devidamente modelado e os relacionamento feitos corretamente( ao se relacionar, é importante deixar como ON cascade no insert e update, assim elas mudam de acordo com a inserção de novos dados. ( mas não vou entrar em detalhes nisso, pois é um assunto para o setor de banco de dados).

     

     

    Um dos primeiros erros ao fazer instruções SQL é o que você está fazendo. Querendo abreviar. Acostume-se a escrever tudo por extenso para que não haja algum problema. Depois de dominar isso, você sim pode abreviar e usar os aliases.

     

    Sobre seu código, como mencionei ali em cima DUAS vezes, use a função COUNT() para contar os registros. 

    EXEMPLO hipotético:

     

    SELECT count(campo da tabela que quer contar) FROM tabela 
    WHERE id = 1

    Então na prática fica assim:

    ID   pergunta                    resposta               respondida
    1    quanto é 2 + 2?                 4                       sim 
    2    Tradução de Blue?               Azul                    sim
    3    A terra é redonda?              Não                     sim
    4    Existe uma bola quadrada?      Sim e ela é do kiko      não

    Como consultar para saber quantas respostas teve sim e quantas teve não?

    SELECT respondida, count(respondida) as qtd_respondida FROM perguntas
    WHERE respondida = 'sim'
    group by respondida
    

    Isto  retornaria algo assim:

    respondida  qtd_respondida
       sim           3
       não           1

    Ou seja,  foi agrupado pelo campo "respondida"  e contada quantos registros de cada possui.

    É esse comando que você deve usar no seu código,  count()   do mysql

     

    http://www.w3resource.com/mysql/aggregate-functions-and-grouping/count.php

    Um link para você ler sobre  count() e agrupamentos com group by

     

    Fora isso, basta fazer no php a consulta certa que vai retornar o que você quer.

    Em suma, a função que você DEVE e precisa usar é o count() para contar os registros.

    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×