Ir ao conteúdo

Posts recomendados

Postado

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.

  • Moderador
Postado

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

  • Curtir 2
Postado
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.

 

  • Moderador
Postado

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

  • Moderador
Postado

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
Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!