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:  

Recommended Posts

Postado (editado)

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;
		
	}

 

Editado por DiF

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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

Editado por DiF

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

 

Opa muito obrigado pela dica, realmente tive 'quebrar' a tabela em 2, ficou mais simples, achei que conseguia resolver com apenas uma, valeu abraço!

Editado por DiF
Apenas remover a citação porque era grande demais!

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

×