Ir ao conteúdo

Posts recomendados

Postado

Caros boa noite, estou com uma dúvida

 

Preciso de ajuda no $sql3 ou reformular a minha lógica:

Atualmente estou fazendo assim:

1. Encontrar as equipes que fazem parte da atividade;

2. Encontrar os participantes da equipe;

3. Somar os pontos dos participantes da equipe;

 

O que eu preciso fazer é somar os pontos (ATV_XP) da tabela (USUARIOS_ATIVIDADE) dos usuários (USU_CODIGO) que pertencem a equipe (EQP_CODIGO);

 

Possuo 2 tabelas:

TABELA USUARIOS_ATIVIDADE campos principais:

ATV_CODIGO (código da atividade),

USU_CODIGO (código do usuário),

ATV_XP (pontos do usuário)

aqui faço os controles de interações dos usuários;

 

TABELA EQUIPES campos principais:

ATV_CODIGO (código da atividade),

EQP_CODIGO (código da equipe),  

EQP_USUARIO (código do usuário),  

aqui eu controlo as equipes das atividades

 

Segue abaixo como estou fazendo hoje, valeu abraço.

 

public function getMembrosEquipes($id) {	
		
		$retorno = array();
		$cont = 0;
			//select para verificar as equipes da atividade
			$sql = "SELECT DISTINCT EQP_CODIGO, EQP_NOME
				FROM EQUIPES
				WHERE ATV_CODIGO =".$id;
					
			$exc = new OracleRecordset($this->conexao->execute($sql));
			//echo "@@@@@".$sql;
		
			while($exc->fetch()) {
				//select para encontrar os participantes da equipe da atividade
				$sql2 = "SELECT EQP_USUARIO
				FROM EQUIPES
				WHERE EQP_CODIGO =".$exc->getResult('EQP_CODIGO')."
				AND ATV_CODIGO =".$id;
				$exc2 = new OracleRecordset($this->conexao->execute($sql2));
				$exc2->fetch();
				//echo "#####".$sql2;
				
				$usu = $exc2->getResult('EQP_USUARIO');
				$equipe = $exc->getResult('EQP_CODIGO');
				
				//select para somar os pontos do usuário na tabela USUARIOS_ATIVIDADE
				$sql3 = "SELECT count(DISTINCT UA.USU_CODIGO), sum(UA.ATV_XP) AS ATV_XP, U.USU_CODIGO, U.USU_NOME, U.USU_SOBRENOME, U.USU_IMAGEM, U.USU_XP
					FROM USUARIOS_ATIVIDADE UA
					LEFT OUTER JOIN USUARIOS U ON (UA.USU_CODIGO = U.USU_CODIGO) 
					WHERE UA.ATV_CODIGO = ".$id."
                    GROUP BY UA.USU_CODIGO
					ORDER BY ATV_XP DESC";
				$exc3 = new OracleRecordset($this->conexao->execute($sql3));
				$exc3->fetch();
				echo "#####".$sql3;
				
				$atvbean = new AtividadesBean();		
                $atvbean->setAtvXp($exc3->getResult('ATV_XP'));

				$eqpbean = new EquipesBean();		
				$eqpbean->setEqpParticipantes($exc2->getResult('EQP_USUARIO'));
				$eqpbean->setEqpCodigo($exc->getResult('EQP_CODIGO'));
				$eqpbean->setEqpNome($exc->getResult('EQP_NOME'));
				$eqpbean->setEqpAtvXp($atvbean);

				$retorno[$cont] = $eqpbean;

				$cont++;
			}
		
		unset($exc);
		unset($exc2);
		unset($exc3);
		return $retorno;
		
	}

 

  • Moderador
  • Solução
Postado

@Gláuber Guilherme Signori Olá,

 

Não sei como está modelado seu banco de dados, mas é imprescindível que se siga as 1NF, 2NF pelo menos. No caso, destrinchar as tabelas em várias.

 

Dado este modelo:

xWPyhbw.png

 

Basicamente você fará uma única consulta para trazer a soma dos pontos dos usuários agrupados por equipe.

Desta forma:

SELECT equipes.nome, 
       (SELECT SUM(usuario_pontos.pontos)) AS total
FROM usuario_atividade
INNER JOIN equipes ON equipes.id = usuario_atividade.equipe 
INNER JOIN usuario_pontos ON usuario_pontos.id = usuario_atividade.pontos
GROUP BY equipes.nome

 

A consulta acima traz o nome da equipe e a soma dos pontos agrupados pelo nome da equipe.

Repare que  a tabela usuario_atividade é uma tabela N:N  entre usuario e usuario_pontos.

Onde o id dos pontos de cada um é enviado para a tabela usuario_atividade, que nesta tabela também recebe o id do usuário, id da equipe e id da atividade.

Resultado:

rLbzAZ0.png

Com  isso pode-se fazer uma segunda consulta para mostrar a parcial desta forma:

SELECT atividades.nome, 
       usuarios.nome,
       equipes.nome,
       usuario_pontos.pontos
FROM usuario_atividade
INNER JOIN atividades ON atividades.id = usuario_atividade.atividade
INNER JOIN usuarios ON usuarios.id = usuario_atividade.usuario
INNER JOIN equipes ON equipes.id = usuario_atividade.equipe
INNER JOIN usuario_pontos ON usuario_pontos.id = usuario_atividade.pontos

Resultado:

60UaLAz.png

 

Basicamente é isso. Agora no PHP é com você :thumbsup:

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!