Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lucas Fernando

Duas Chaves estrangeiras iguais para uma consulta diferente

Recommended Posts

Pessoal como já comentei em outro topico estou desenvolvendo um sistema de apontamento de horas.
Está ficando muito bacana na verdade já estava pronto, porem achei bacana criar uma aprovação do gerente ai que estou encontrando problema.


time_data (armazena apontamento)

-- Estrutura da tabela `time_data`
--

CREATE TABLE IF NOT EXISTS `time_data` (
  `time_id` int(10) NOT NULL AUTO_INCREMENT,
  `user_id` int(10) NOT NULL DEFAULT '0',
  `function_fk` int(10) NOT NULL,
  `data_date` date DEFAULT NULL,
  `type_id` int(10) NOT NULL DEFAULT '0',
  `work_id_fk` int(10) NOT NULL,
  `hours` double DEFAULT NULL,
  `notes` text,
  `user_appro_fk` int(10) DEFAULT NULL,
  `status_appro` char(1) NOT NULL,
  PRIMARY KEY (`time_id`),
  KEY `user_id` (`user_id`),
  KEY `type_id` (`type_id`),
  KEY `work_id_fk` (`work_id_fk`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

--
-- Extraindo dados da tabela `time_data`
--

 

tabela de usuarios

 

-- Estrutura da tabela `user_info`
--

CREATE TABLE IF NOT EXISTS `user_info` (
  `user_id` int(10) NOT NULL AUTO_INCREMENT,
  `fname` varchar(50) DEFAULT NULL,
  `lname` varchar(50) DEFAULT NULL,
  `function_id_fk` int(10) NOT NULL DEFAULT '0',
  `level` varchar(20) NOT NULL DEFAULT 'User',
  `username` varchar(30) NOT NULL DEFAULT '',
  `password` varchar(40) NOT NULL DEFAULT '',
  PRIMARY KEY (`user_id`),
  KEY `function_id_fk` (`function_id_fk`),
  KEY `function_id_fk_2` (`function_id_fk`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Extraindo dados da tabela `user_info`

 


Eu preciso gerar uma consulta assim:

Nome Completo | Função | Data | Tipo Horas | Projeto | obs | Aprovado | Aprovador

 

 

Porem estou me enrroscando para mostrar o aprovador, pois na verdade estou trabalhando com duas chaves estrangeiras, user_id e user_appro_fk, ambas trazem dados de uma unica tabela que é a user_info


Basicamente até agora montei a seguinte consulta:

 

select usr.fname, usr.lname, fun.function_desc, dat.function_fk, DATE_FORMAT(dat.data_date, '%d/%m/%Y') AS date_br, wor.work_name, dat.hours,
        pro.description, dat.notes, dat.status_appro, CASE dat.status_appro
                    WHEN 'S' THEN 'Sim'
                    WHEN 'N' THEN 'Não'
                    END as status_appro, dat.user_appro_fk  
                    from
                    user_info usr, user_functions fun, time_work wor, time_types pro, time_data dat
               where dat.function_fk = fun.function_id and usr.user_id = dat.user_id and dat.type_id = pro.type_id and dat.work_id_fk = wor.work_id
               and dat.user_id LIKE '%$user_id%' and dat.type_id LIKE '%$type_id%' and dat.status_appro LIKE '%$status_appro%' and dat.data_date between '$start_date' and '$end_date'
               order by dat.data_date desc

 

os dados apresentado ficaram assim:

 

Nome Completo Função Data Tipo Horas Projeto obs Aprovado Aprovador

Marcos Sandrini Auxiliar de T.I 12/10/2013 HN 4 TESTE Sim 1

 

resumindo estou tendo problemas para mostrar o nome do aprovador, pois ja estou usando a consulta para mostrar o nome completo do usuário

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui resolver, porem fiz uma enorme consulta, se alguem tiver alguma solução um pouco menor eu agradeço ^^

 

   $consulta = "select concat(usr.fname,' ',usr.lname) as full_funname , fun.function_desc, 
dat.function_fk, DATE_FORMAT(dat.data_date, '%d/%m/%Y') AS date_br, wor.work_name, dat.hours, pro.description, dat.notes, dat.status_appro, CASE dat.status_appro
                    WHEN 'S' THEN 'Sim'
                    WHEN 'N' THEN 'Não'
                    END as status_appro, dat.user_appro_fk, app.user_id, concat(app.fname,' ',app.lname) as full_appname
                    from 
user_info usr, user_functions fun, time_work wor, time_types pro, time_data dat, user_info app 
where dat.function_fk = fun.function_id and usr.user_id = dat.user_id and dat.type_id = pro.type_id and dat.work_id_fk = wor.work_id and dat.user_appro_fk = app.user_id
               and dat.user_id LIKE '%$user_id%' and dat.type_id LIKE '%$type_id%' and dat.status_appro LIKE '%$status_appro%' and dat.data_date between '$start_date' and '$end_date'
               order by dat.data_date desc";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos ainda encontrei um erro na consulta,

Quando o apontamento ainda não for aprovado

 

o campo dat.user_appro_fk será igual a 0 . Dessa forma não existe comparação e nenhum registro será mostrado, para não aprovadas.

 

Até agora a unica ideia que eu tive é criar um usuário com o nome "Não Aprovado" e deixar como padrão ao incluir ou alterar horas, porem estou achando uma bambiarra muito ruim, alguem tem alguma ideia melhor ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos ainda encontrei um erro na consulta,

Quando o apontamento ainda não for aprovado

 

o campo dat.user_appro_fk será igual a 0 . Dessa forma não existe comparação e nenhum registro será mostrado, para não aprovadas.

Um outer join resolveria, creio, bastaria tratar o "null" na chave da fk.

Compartilhar este post


Link para o post
Compartilhar em outros sites

bem não acho uma gambiarra deixa um registro como padrão.

 

por que quando você faz join sempre tem q ter relacionamento.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lucas Fernando , vamos lá :

 

Tentou fazer por outer join ?

É o caso de Outer Join (falta um registro do "outro lado") ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.