mnmn

Membros
  • Content Count

    19
  • Joined

  • Last visited

Community Reputation

0 Neutro

About mnmn

  1. Olá pessoal. Tenho o seguinte código onde tenho duas queries, na primeira capturo o COUNT do campo nome_usuario, na segunda seleciono os campos que desejo. Gostaria de melhorar a performance, fazendo uma só query. Alguém pode me ajudar? <?php defined('BASEPATH') OR exit('No direct script access allowed'); class TodosAgendamentosFuturos_model extends CI_Model{ public function main($funcionario, $dataAtual, $limit, $start) { //Array para guardar dados a serem retornados $resultados = array(); //QUERY TO BIND TOTALCOUNT $sql = "SELECT DISTINCT COUNT(u.nome_usuario) AS total FROM horariosfuncionario hfs INNER JOIN usuario u INNER JOIN statushorariofuncionario shf INNER JOIN funcionario f INNER JOIN agendamento a INNER JOIN formapagamentosalao fps ON a.codigo_formapagamentosalao = fps.codigo_formapagamentosalao AND a.codigo_usuario = u.codigo_usuario AND a.codigo_horariosfuncionario = hfs.codigo_horariosfuncionario AND shf.codigo_statushorariofuncionario = hfs.codigo_statushorariofuncionario AND f.codigo_funcionario = hfs.codigo_funcionario WHERE STR_TO_DATE(hfs.data_horariosfuncionario, '%d/%m/%Y') > STR_TO_DATE(?, '%d/%m/%Y') AND f.codigo_funcionario = ? ORDER BY STR_TO_DATE(hfs.data_horariosfuncionario, '%d/%m/%Y'), STR_TO_DATE(hfs.horario_horariosfuncionario,'%H:%i')"; $total = $this->db->query($sql, array($dataAtual, $funcionario)); //Selecionando todos agendamentos futuros $sql = "SELECT DISTINCT u.nome_usuario, u.telefone1_usuario, u.telefone2_usuario, a.codigo_agendamento, hfs.horario_horariosfuncionario, hfs.data_horariosfuncionario, a.comentario_agendamento, fps.nome_formapagamentosalao FROM horariosfuncionario hfs INNER JOIN usuario u INNER JOIN statushorariofuncionario shf INNER JOIN funcionario f INNER JOIN agendamento a INNER JOIN formapagamentosalao fps ON a.codigo_formapagamentosalao = fps.codigo_formapagamentosalao AND a.codigo_usuario = u.codigo_usuario AND a.codigo_horariosfuncionario = hfs.codigo_horariosfuncionario AND shf.codigo_statushorariofuncionario = hfs.codigo_statushorariofuncionario AND f.codigo_funcionario = hfs.codigo_funcionario WHERE STR_TO_DATE(hfs.data_horariosfuncionario, '%d/%m/%Y') > STR_TO_DATE(?, '%d/%m/%Y') AND f.codigo_funcionario = ? ORDER BY STR_TO_DATE(hfs.data_horariosfuncionario, '%d/%m/%Y'), STR_TO_DATE(hfs.horario_horariosfuncionario,'%H:%i') LIMIT ".$limit." OFFSET ".$start; $resultado = $this->db->query($sql, array($dataAtual, $funcionario)); //Percorrendo resultados retornados foreach ($resultado->result() as $row) { //Captura dia da semana da data enviada como parâmetro usando o helper dia_semana $dia = diasemana($dataAtual); //Adiciona resultados no array resultados array_push($resultados, array('nome_usuario' => $row->nome_usuario, 'telefone1_usuario' => $row->telefone1_usuario, 'telefone2_usuario' => $row->telefone2_usuario, 'codigo_agendamento' => $row->codigo_agendamento, 'horario' => $row->horario_horariosfuncionario, 'data' => $row->data_horariosfuncionario, 'nomeDiaSemana' => $dia, 'comentario' => $row->comentario_agendamento, 'formaPagamento' => $row->nome_formapagamentosalao)); } $rows = $resultados; $data = array( "success"=>true, "totalCount"=>$total->row()->total, "menu"=>$rows ); echo json_encode($data); } }
  2. Boa noite pessoal. Podem me ajudar? Tenho uma requisição ajax onde no success dela eu chamo outra requisição ajax e na segunda requisição eu preciso capturar o valor da primeira requisição. O valor que preciso está na linha: 23 (variável dados); Onde tento acessar esse valor e está dando erro é na linha: 54 (está dando o erro: Uncaught TypeError: Cannot read property 'resultado' of undefined) https://gist.github.com/anonymous/771a6ee75597fdd3faa9
  3. Olá pessoal... Estou usando banco de dados MySQL e preciso obter os seguintes dados do meu servidor: dia, mês, ano, hora, minuto, fuso horário. Então já estou capturando: Dia: SELECT Day(now()); Mês: SELECT Month(now()); Ano: SELECT Year(now()); Hora: SELECT Hour(now()); Minuto: SELECT Minute(now()); Ainda não sei como capturar o fuso horário, poderiam me ajudar?
  4. Olá pessoal, tudo bom? Estou usando a linguagem JavaScript e estou com um problema: tenho no banco de dados MySQL o cadastro do fuso horário dos clientes. Exemplo: -3, -4, +1 Então preciso capturar a data e hora atual do fuso horário pesquisado. Alguém sabe como posso resolver essa questão? Toda ajuda é bem vinda, desde já agradeço.
  5. Olá pessoal, tudo bom? Poderiam me ajudar? Depois de executar o primeiro select preciso capturar o valor de duas calunas para cada linha retornada na consulta. As colunas que preciso capturar são: horario_horariofuncionario e tempo_servicosalao. Após capturar os valores dessas colunas, necessito usar esses valores no select que está dentro do laço WHILE. Porém a variável está vindo com valor diferente: deveria ser '21:00' mas está vindo :00 <?php include 'conectar.php'; $servico = $_GET['servico']; $data = $_GET['data']; $diaDaSemana = $_GET['diaDaSemana']; $stmt = $conn->query("SET CHARACTER SET utf8"); $stmt = $conn->query("SET NAMES utf8"); //Selecionando horários disponíveis na data selecionada para todos profissionais que fizerem o serviço selecionado $stmt = $conn->prepare("SELECT hf.horario_horariofuncionario, hf.codigo_horariofuncionario, sf.codigo_servicosalao, s.nome_servico, ss.tempo_servicosalao, ss.preco_servicosalao, hf.data_horariofuncionario, hf.nomeDiaSemana_horariofuncionario, f.codigo_funcionario, f.nome_funcionario, f.apelido_funcionario, f.foto_funcionario FROM servicosalao ss NATURAL JOIN servico s NATURAL JOIN horariofuncionario hf NATURAL JOIN funcionario f NATURAL JOIN servicofuncionario sf WHERE sf.codigo_servicosalao = :servico AND hf.data_horariofuncionario = :data AND hf.nomeDiaSemana_horariofuncionario = :diaDaSemana AND hf.codigo_statushorariofuncionario IN (1,3) ORDER BY STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i')"); $stmt->bindParam(':servico', $servico, PDO::PARAM_INT); $stmt->bindParam(':data', $data, PDO::PARAM_STR, 10); $stmt->bindParam(':diaDaSemana', $diaDaSemana, PDO::PARAM_STR, 15); $stmt->execute(); //Criando array $rows = array(); //Percorrendo resultados retornados while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $horario = $row['horario_horariofuncionario']; $tempo = $row['tempo_servicosalao']; $stmt = $conn->prepare("SELECT hf.horario_horariofuncionario FROM horariofuncionario hf NATURAL JOIN servicofuncionario sf WHERE sf.codigo_servicosalao = :servico AND hf.data_horariofuncionario = :data AND hf.nomeDiaSemana_horariofuncionario = :diaDaSemana AND hf.codigo_statushorariofuncionario = 2 group by (hf.horario_horariofuncionario) HAVING STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i') BETWEEN STR_TO_DATE($horario,'%H:%i') AND SEC_TO_TIME( SUM( TIME_TO_SEC( STR_TO_DATE($horario,'%H:%i') ) + TIME_TO_SEC( STR_TO_DATE($tempo,'%i') ) ) )"); $stmt->bindParam(':servico', $servico, PDO::PARAM_INT); $stmt->bindParam(':data', $data, PDO::PARAM_STR, 10); $stmt->bindParam(':diaDaSemana', $diaDaSemana, PDO::PARAM_STR, 15); $stmt->execute(); //Recebendo o número de linhas retornadas $rows = $stmt->fetchAll(); //Contando o número de linhas retornadas $total = count($rows); //Se não retornou resultados if($total < 1) { $rows[] = $row; } } echo json_encode($rows); ?>
  6. Olá pessoal, poderiam me ajudar? Tenho as seguintes tabelas: CREATE TABLE horariofuncionario ( codigo_horariofuncionario INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, codigo_statushorariofuncionario INTEGER UNSIGNED NOT NULL, codigo_funcionario INTEGER UNSIGNED NOT NULL, horario_horariofuncionario VARCHAR(5) NOT NULL, data_horariofuncionario VARCHAR(10) NOT NULL, nomeDiaSemana_horariofuncionario VARCHAR(15) NOT NULL, PRIMARY KEY(codigo_horariofuncionario), FOREIGN KEY(codigo_funcionario) REFERENCES funcionario(codigo_funcionario) ON DELETE NO ACTION ON UPDATE NO ACTION, FOREIGN KEY(codigo_statushorariofuncionario) REFERENCES statushorariofuncionario(codigo_statushorariofuncionario) ON DELETE NO ACTION ON UPDATE NO ACTION ); CREATE TABLE servicosalao ( codigo_servicosalao INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, codigo_salao INT NOT NULL, codigo_servico INTEGER UNSIGNED NOT NULL, preco_servicosalao VARCHAR(20) NULL, tempo_servicosalao INTEGER UNSIGNED NULL, descricao_servicosalao VARCHAR(200) NULL, PRIMARY KEY(codigo_servicosalao), FOREIGN KEY(codigo_salao) REFERENCES salao(codigo_salao) ON DELETE NO ACTION ON UPDATE NO ACTION, FOREIGN KEY(codigo_servico) REFERENCES servico(codigo_servico) ON DELETE NO ACTION ON UPDATE NO ACTION ); CREATE TABLE statushorariofuncionario ( codigo_statushorariofuncionario INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, nome_statushorariofuncionario VARCHAR(30) NOT NULL, PRIMARY KEY(codigo_statushorariofuncionario) ); Preciso selecionar os HORARIOFUNCIONARIO.horario_horariofuncionario em que o HORARIOFUNCIONARIO.codigo_statushorariofuncionario seja 1 ou 3 e que não contenha nenhum registro na tabela horariofuncionario em que o HORARIOFUNCIONARIO.horario_horariofuncionario esteja entre o HORARIOFUNCIONARIO.horario_horariofuncionario e o HORARIOFUNCIONARIO.horario_horariofuncionario + SERVICOSALAO.tempo_servicosalao e o HORARIOFUNCIONARIO.codigo_statushorariofuncionario seja igual a 2. Então tenho a query: SELECT hf.horario_horariofuncionario FROM horariofuncionario hf WHERE hf.codigo_statushorariofuncionario IN (1,3) HAVING (SELECT COUNT(hf.codigo_horariofuncionario) FROM horariofuncionario hf NATURAL JOIN servicosalao ss WHERE hf.codigo_statushorariofuncionario = 2 AND STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i') BETWEEN STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i') AND SEC_TO_TIME( SUM( TIME_TO_SEC( STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i') ) + TIME_TO_SEC( STR_TO_DATE(ss.tempo_servicosalao,'%H:%i') ) ) ) ) < 1;Está retornando o erro: Invalid use of group function ErrorNr 1111
  7. mnmn

    Uso de group function

    Olá pessoal, poderiam me ajudar com esse erro? Tenho o seguinte SELECT no qual preciso selecionar somente os horario_horariofuncionario que estejam em um determinado período de tempo (para isso uso a função BETWEEN) e com o codigo_statushorariofuncionario 1 ou 3, (para isso uso a função IN). O sub select não pode retornar nenhum resultado, por isso ao final do sub select adicionei = 0. SELECT hf.horario_horariofuncionario FROM horariofuncionario hf WHERE hf.codigo_statushorariofuncionario IN (1,3) AND (SELECT COUNT(hf.codigo_statushorariofuncionario) FROM horariofuncionario hf NATURAL JOIN servicosalao ss WHERE STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i') BETWEEN (STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i') AND SEC_TO_TIME( SUM( TIME_TO_SEC( STR_TO_DATE(hf.horario_horariofuncionario,'%H:%i') ) + TIME_TO_SEC( STR_TO_DATE(ss.tempo_servicosalao,'%i') ) ) ) ) AND hf.codigo_statushorariofuncionario = 2) = 0; Contudo essa query está retornando o erro: Invalid use of group function ErrorNr: 1111 Agradeço desde já a ajuda de todos.
  8. Denis Courcy, obrigado. Funcionou perfeitamente.
  9. Olá pessoal. Estou precisando calcular as datas anteriores ao dia atual na query abaixo, porém as datas no banco de dados estão com tipo Varchar. Alguém poderia me ajudar? SELECT data_horariofuncionario FROM horariofuncionario WHERE data_horariofuncionario > '17/09/2015';Está retornando as datas que começam com dia a partir de 18, mas o mês está retornando mês 08, mês 09. O que devo fazer? Obrigado, desde já.
  10. Denis Courcy, perfeito!!! Você é DBA? Muito obrigado mesmo.
  11. Muito bom Denis Courcy, ficou assim: 'Absolut control - hidratação L'Óreal', 30, '40,00', '28/08/2015', 'Sexta-feira', 'Ziraldo de Almeida Lopes', 'Guga', '', '13:00,18:00', '22,23'Porém preciso do codigo_horariofuncionario junto do horario_horariofuncionario porque cada registro de horario_horariofuncionario será um botão e quando clicar no botão preciso pegar o codigo_horariofuncionario relativo ao horario_horariofuncionario clicado. Tentei fazendo o GROUP_CONCAT assim: GROUP_CONCAT(codigo_horariofuncionario, horario_horariofuncionario) mas ainda foram geradas duas linhas de resultado. O resultado final precisa ser como neste foto:
  12. Denis Courcy, o resultado é este: 22, 'Absolut control - hidratação L'Óreal', 30, '40,00', '28/08/2015', 'Sexta-feira', 'Ziraldo de Almeida Lopes', 'Guga', '', '13:00' 23, 'Absolut control - hidratação L'Óreal', 30, '40,00', '28/08/2015', 'Sexta-feira', 'Ziraldo de Almeida Lopes', 'Guga', '', '18:00'
  13. Bom dia Denis Courcy. Então a cláusula final ficou assim: SELECT hf.codigo_horariofuncionario, s.nome_servico, ss.tempo_servicosalao, ss.preco_servicosalao, hf.data_horariofuncionario, ds.nome_diasemana, f.nome_funcionario, f.apelido_funcionario, f.foto_funcionario, GROUP_CONCAT(hf.horario_horariofuncionario) AS horario FROM servicosalao ss INNER JOIN servico s ON s.codigo_servico = ss.codigo_servico INNER JOIN servicofuncionario sf ON sf.codigo_servicosalao = ss.codigo_servicosalao INNER JOIN funcionario f ON f.codigo_funcionario = sf.codigo_funcionario INNER JOIN horariofuncionario hf ON hf.codigo_funcionario = f.codigo_funcionario INNER JOIN diasemana ds ON ds.codigo_diasemana = hf.codigo_diasemana WHERE sf.codigo_servicosalao = 6 AND hf.data_horariofuncionario = '28/08/2015' AND ds.nome_diasemana = 'Sexta-feira' AND hf.codigo_statushorariofuncionario = 1 GROUP BY hf.codigo_horariofuncionario, s.nome_servico, ss.tempo_servicosalao, ss.preco_servicosalao, hf.data_horariofuncionario, ds.nome_diasemana, f.nome_funcionario;Porém ainda estão sendo geradas duas linhas... uma para cada horario_horariofuncionario. O GROUP_CONCAT não funcionou neste caso.
  14. Denis Courcy, fiz algumas interferências no código pois não estava retornando resultados. Ficou assim: SELECT hf.codigo_horariofuncionario, s.nome_servico, ss.tempo_servicosalao, ss.preco_servicosalao, hf.data_horariofuncionario, ds.nome_diasemana, f.nome_funcionario, f.apelido_funcionario, f.foto_funcionario, GROUP_CONCAT(hf.horario_horariofuncionario) AS horario FROM servicosalao ss INNER JOIN servico s ON s.codigo_servico = ss.codigo_servico INNER JOIN servicofuncionario sf ON sf.codigo_servicosalao = ss.codigo_servicosalao INNER JOIN funcionario f ON f.codigo_funcionario = sf.codigo_funcionario INNER JOIN horariofuncionario hf ON hf.codigo_funcionario = f.codigo_funcionario INNER JOIN diasemana ds ON ds.codigo_diasemana = hf.codigo_diasemana WHERE sf.codigo_servicosalao = 6 AND hf.data_horariofuncionario = '28/08/2015' AND ds.nome_diasemana = 'Sexta-feira' AND hf.codigo_statushorariofuncionario = 1 GROUP BY hf.codigo_horariofuncionario, s.nome_servico, ss.tempo_servicosalao, ss.preco_servicosalao, hf.data_horariofuncionario, ds.nome_diasemana, f.nome_funcionario; Apenas coloquei algumas claúsulas ON que não tinham e mudei esta linha: INNER JOIN funcionario f f.codigo_funcionario = f.codigo_funcionario = sf.codigo_funcionarioporque haviam duas vezes a referência para f.codigo_funcionario Mas o resultado foram duas linhas... porque existem dois horários (horario_horariofuncionario) diferentes... vi que você usou o GROUP_CONCAT mas ainda assim estão sendo geradas uma linha para cada novo horário (horario_horariofuncionario).
  15. Claro Denis Courcy, seguem as estruturas: Tabela servico: CREATE TABLE `salao`.`servico` ( `codigo_servico` int(10) unsigned NOT NULL AUTO_INCREMENT, `nome_servico` varchar(100) NOT NULL, PRIMARY KEY (`codigo_servico`) ) ENGINE=InnoDB AUTO_INCREMENT=462 DEFAULT CHARSET=latin1; Tabela diasemana: CREATE TABLE `salao`.`diasemana` ( `codigo_diasemana` int(10) unsigned NOT NULL AUTO_INCREMENT, `nome_diasemana` varchar(15) CHARACTER SET latin1 NOT NULL, PRIMARY KEY (`codigo_diasemana`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_general_mysql500_ci; Tabela horariofuncionario: CREATE TABLE `salao`.`horariofuncionario` ( `codigo_horariofuncionario` int(10) unsigned NOT NULL AUTO_INCREMENT, `codigo_funcionario` int(10) unsigned NOT NULL, `horario_horariofuncionario` varchar(5) CHARACTER SET latin1 NOT NULL, `codigo_diasemana` int(10) unsigned NOT NULL, `data_horariofuncionario` varchar(10) COLLATE utf8_general_mysql500_ci NOT NULL, `codigo_statushorariofuncionario` int(10) unsigned NOT NULL, PRIMARY KEY (`codigo_horariofuncionario`), KEY `FK_horariofuncionario_1` (`codigo_funcionario`), KEY `FK_horariofuncionario_2` (`codigo_diasemana`), KEY `FK_horariofuncionario_3` (`codigo_statushorariofuncionario`), CONSTRAINT `FK_horariofuncionario_1` FOREIGN KEY (`codigo_funcionario`) REFERENCES `funcionario` (`codigo_funcionario`), CONSTRAINT `FK_horariofuncionario_2` FOREIGN KEY (`codigo_diasemana`) REFERENCES `diasemana` (`codigo_diasemana`), CONSTRAINT `FK_horariofuncionario_3` FOREIGN KEY (`codigo_statushorariofuncionario`) REFERENCES `statushorariofuncionario` (`codigo_statushorariofuncionario`) ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8 COLLATE=utf8_general_mysql500_ci; Tabela funcionario: CREATE TABLE `salao`.`funcionario` ( `codigo_funcionario` int(10) unsigned NOT NULL AUTO_INCREMENT, `cidade_funcionario` varchar(30) CHARACTER SET latin1 DEFAULT NULL, `bairro_funcionario` varchar(30) CHARACTER SET latin1 DEFAULT NULL, `logradouro_funcionario` varchar(30) CHARACTER SET latin1 DEFAULT NULL, `cep_funcionario` varchar(9) CHARACTER SET latin1 DEFAULT NULL, `complemento_funcionario` varchar(10) CHARACTER SET latin1 DEFAULT NULL, `email_funcionario` varchar(60) CHARACTER SET latin1 DEFAULT NULL, `telefone1_funcionario` varchar(15) CHARACTER SET latin1 DEFAULT NULL, `telefone2_funcionario` varchar(15) CHARACTER SET latin1 DEFAULT NULL, `telefone3_funcionario` varchar(15) CHARACTER SET latin1 DEFAULT NULL, `codigo_estado` int(10) unsigned NOT NULL, `foto_funcionario` varchar(100) CHARACTER SET latin1 DEFAULT NULL, `email_salao` varchar(60) CHARACTER SET latin1 DEFAULT NULL, `nome_funcionario` varchar(100) COLLATE utf8_general_mysql500_ci DEFAULT NULL, `apelido_funcionario` varchar(30) COLLATE utf8_general_mysql500_ci DEFAULT NULL, PRIMARY KEY (`codigo_funcionario`), KEY `FK_funcionario_1` (`codigo_estado`), KEY `FK_funcionario_2` (`email_salao`), CONSTRAINT `FK_funcionario_1` FOREIGN KEY (`codigo_estado`) REFERENCES `estado` (`codigo_estado`), CONSTRAINT `FK_funcionario_2` FOREIGN KEY (`email_salao`) REFERENCES `salao` (`email_salao`) ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_general_mysql500_ci; Tabela servicofuncionario: CREATE TABLE `salao`.`servicofuncionario` ( `codigo_servicofuncionario` int(10) unsigned NOT NULL AUTO_INCREMENT, `codigo_funcionario` int(10) unsigned NOT NULL, `codigo_servicosalao` int(10) unsigned NOT NULL, PRIMARY KEY (`codigo_servicofuncionario`), KEY `FK_servicofuncionario_1` (`codigo_funcionario`), KEY `FK_servicofuncionario_2` (`codigo_servicosalao`), CONSTRAINT `FK_servicofuncionario_1` FOREIGN KEY (`codigo_funcionario`) REFERENCES `funcionario` (`codigo_funcionario`), CONSTRAINT `FK_servicofuncionario_2` FOREIGN KEY (`codigo_servicosalao`) REFERENCES `servicosalao` (`codigo_servicosalao`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_general_mysql500_ci; Preciso fazer como na imagem abaixo... preciso selecionar os atríbutos abaixo s.nome_servico, ss.tempo_servicosalao, ss.preco_servicosalao, hf.data_horariofuncionario, ds.nome_diasemana, f.nome_funcionario, f.apelido_funcionario, f.foto_funcionarioe os N horários (horariofuncionario) que o funcionário tem... tudo junto.