-
Total de itens
3.089 -
Registro em
-
Última visita
Posts postados por Denis Courcy
-
-
Substitua
SELECT * FROM processos p INNER JOIN (SELECT * FROM historico h GROUP BY h.processo_id HAVING MAX(h.`data`)) h1 ON h1.processo_id = p.id WHERE h1.`data` < minhaDate_Sub(DATE(NOW()), 15, 'D');
Por
SELECT * FROM processos p INNER JOIN (SELECT h.id, h.processo_id, h.tipo, h.observacoes, MAX(h.data) FROM historico h GROUP BY h.processo_id) h1 ON h1.processo_id = p.id WHERE h1.`data` < minhaDate_Sub(DATE(NOW()), 15, 'D');
Se possível troque o nome do campo `data` por outro de sua conveniência, pois data é palavra chave do MySQL e pode causar confusão.
-
Verifique se é isso que você quer:
SELECT * FROM processos p INNER JOIN (SELECT * FROM historico h GROUP BY h.processo_id HAVING MAX(h.`data`)) h1 ON h1.processo_id = p.id WHERE h1.`data` < DATE_SUB(DATE(NOW()), INTERVAL 15 DAY);
Onde o select
SELECT * FROM historico h GROUP BY h.processo_id HAVING MAX(h.`data`)
retorna os históricos com as maiores datas
h1 é o nome da tabela gerada pelo select acima(o que busca as maiores datas)
DATE_SUB(DATE(NOW()), INTERVAL 15 DAY)
é a função que retorna datas com menos de 15 dias (15 é variável).
Se quiser pode usar minha função que retorna qualquer tipo de intervalo
DELIMITER $$ USE `test`$$ -- eh o nome do banco use o seu DROP FUNCTION IF EXISTS `minhaDate_Sub`$$ CREATE DEFINER=`root`@`localhost` FUNCTION `minhaDate_Sub`(dtInicial DATE, intervalo INTEGER, tipo CHAR(1)) RETURNS DATE BEGIN DECLARE retorno DATE DEFAULT NULL; IF intervalo > 0 THEN IF tipo = 'D' THEN SET retorno = DATE_SUB(dtInicial, INTERVAL intervalo DAY); END IF; IF tipo = 'M' THEN SET retorno = DATE_SUB(dtInicial, INTERVAL intervalo MONTH); END IF; IF tipo = 'A' THEN SET retorno = DATE_SUB(dtInicial, INTERVAL intervalo YEAR); END IF; END IF; RETURN retorno; END$$ DELIMITER ;
Exemplo de uso:
SELECT * FROM processos p INNER JOIN (SELECT * FROM historico h GROUP BY h.processo_id HAVING MAX(h.`data`)) h1 ON h1.processo_id = p.id WHERE h1.`data` < minhaDate_Sub(DATE(NOW()), 15, 'D');
-
Proceda assim:
Faça um backup das tabelas em questão.
Desvincule o constraint se existir.
Converta o campo de string para numerico varchar para int
Os campos devem ser do mesmo tipo e tamanho nas duas tabelas.
refaça o vinculo de constraint.
Verifique se tudo está ok
Se estiver ok elimine as tabelas de backup.
Mais simples do que você está querendo fazer.
Se você errar é so voltar o backup destas tabelas
-
Normalmente eu utilizo uma tabela de histórico (cópia da estrutura da tabela que quero acompanhar, com um campo a mais que é a data hora de entrada no historico.
CREATE TABLE IF NOT EXISTS `roupas_historico` ( `cod_paciente` int(10) NOT NULL, `cod_roupa` int(15) NOT NULL PRIMARY KEY AUTO_INCREMENT `Descroupa` varchar(500) COLLATE utf8_bin NOT NULL, `horariovista` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `SaidaOuEntrada` varchar(10) COLLATE utf8_bin NOT NULL, dtEntradaHistorico datetime )
O trigger fica assim:
DELIMITER $$ CREATE TRIGGER `nomedobanco`.`trg_log` BEFORE UPDATE ON `nomedobanco`.`teste` FOR EACH ROW BEGIN INSERT INTO roupas_historico(`cod_paciente`, `cod_roupa`, `Descroupa`, `horariovista`, `SaidaOuEntrada`, dtEntradaHistorico) VALUES (OLD.`cod_paciente`, OLD.`cod_roupa`, OLD.`Descroupa`, OLD.`horariovista`, OLD.`SaidaOuEntrada`, NOW()); END$$ DELIMITER ;
A gravação do log acontece antes da gravação dos dados desejados. O log recebe os dados que estavam na tabela antes de serem atualizados.
Em minhas tabelas eu utilizo 4 campos a mais que não coloquei aqui que são:
data hora inclusão informação
data hora atualização informação
identificador usuário resp inclusão
identificador usuário resp alteração
-
A sintaxe correta é CREATE DATABASE sistemahx;
Você digitou CREAT DATABASE sistemahx;
-
Leia sobre MySQL Server Time Zone Support no manual do mysql de sua versão
-
INNER JOIN é intercessão de conjuntos. Se não houver elemento em determinado conjunto (tabela), então não há intercessão. Em seu caso, não há o que deletar.
Uma abordagem através de uma procedure trará uma resposta mais segura, em se caso.
-
Faça através de Storage procedure. É o melhor caminho.
-
Normalmente eu opto por armazenar arquivos e fotos fora do banco. É a melhor prática.
Quanto a evitar acessos indevidos, isto dependerá do tipo de segurança que você quiser adotar para seu servidor de arquivos.
Na questão backup, uma rotina de backup bem feita pode fazer o backup do banco e dos arquivos num mesmo momento e com toda a segurança necessária.
-
INNER JOIN é intercessão de conjuntos.
Passe os INNERS JOIN para LEFT JOIN.
Pode ser que em um deles haja um único registro como retorno e, por isso, esteja retornando um único registro.
Depois, volte um por um os LEFT JOIN para INNER e você verá se isso se comprova.
-
Já pensaste em usar uma tabela separada para guardar os IDs e alimentá-los por stored procedures em vez de usar auto_increment?
-
Oi Graciel,
Você pode mostrar o código da sp para que eu possa analisar, por favor?
-
Tenta assim:
SELECT f1.M3a, L.m3 AS m3Lote, f1.m3Verde, f1.m3Seca, pesoCarga, m3Carga - L.m3 AS m3Consumo, ROUND((pesoCarga * (m3Carga-L.m3))/ m3Carga,2) AS pesoConsumido, ROUND((sum(F.m3)/(m3Carga-L.m3))*100,2) AS RENDIMENTO, DATE_FORMAT(L.`dataInicio`,'%d/%m/%Y') AS lote_dataInicio, DATE_FORMAT(L.`dataFechamento`,'%d/%m/%Y') AS lote_dataFechamento, F.idFardoLamina AS fardolamina_idFardoLamina, F.m3 AS fardolamina_m3, F.consumoTora AS fardolamina_consumoTora, F.idLote AS fardolamina_idLote, O.nomeFornecedor AS fornecedor, DATE_FORMAT(NOW(),'%d/%m/%Y') as data FROM fardolamina F INNER JOIN lote L on L.idLote = F.idLote INNER JOIN fornecedor O on O.idFornecedor = L.idFornecedor INNER JOIN (SELECT f1a.idLote, sum(f1a.m3) AS M3a, sum(IF(f1a.estado = 'v',f1a.m3,0)) AS m3Verde, sum(IF(f1a.estado = 's',f1a.m3,0)) AS m3Seca FROM fardoLamina f1a GROUP BY f1a.idLote) f1 ON f1.idLote = F.idLote LEFT JOIN (SELECT c1.idLote, sum(c1.m3) AS m3Carga, sum(c1.tonelada) AS pesoCarga FROM carga c1 GROUP BY c1.idLote) C on C.idLote = L.idLote
-
Faça assim:
select a.nome from autor a inner join escreve e on e.autor_idautor = a.idautor inner join livro l on l.idlivro = e.livro_idlivro where l.estoque = 0;
-
Passe a estrutura das tabelas
-
Normalmente, nas tabelas mais importantes eu coloco 4 campos a mais
Datahora inclusão registro
Datahora alteracao registro
id uuario resp inclusao
id usuario resp alteracao
Também crio uma tabela historico com a mesma estruturada tabela em questão e com um campo a mais
Datahora inclusao no historico
Cada alteracao feita na tabela original dispara um trigger que alimenta a tabela historico com os dados antes de serem alterados
Quando uma alteração
-
Esta pergunta se refere ao funcionamento da operação em PHP. Não tem nada a haver com MySQL.
Movendo para o fórum de PHP.
-
Valores numéricos separados por ponto de milhar, milhão, etc? Nenhum tipo aceita.
Use funções de transformação para string no momento de exibí-los.
-
Jogue o conteudo desta string para uma variavel e faça um breakpoint para ver se o sql gerado está do jeito que você quer.
-
Qual a estrutura da tabela `InfResp_BounceRegs`?
Qual o comando existente antes de -- Start command --?
Qual o comando existe após -- End command --?
-
Por favor post apenas códigos de sql. Este é um site de MySQL e não de PHP ou outra linguagem.
Quando a sua query
SELECT * FROM item_pedido i INNER JOIN produto p ON i.id_pedido = '".$id."' AND i.id_produto = p.prod_id ORDER BY p.prod_descricao
1) Use a cláusula ON somente para o relacionamento entre tabelas. Passe o
i.id_pedido = '".$id."' AND
Para a cláusula WHERE que é o local apropriado.
2) Verifique se existem índices para
id_produto na tabela item_pedido ;
prod_id na tabela produto (creio que deva ser o primary key desta tabela)
prod_descricao na tabela produto (creio que deva ser unike key para esta tabela)
-
Você postou no forum errado.
Este forum é de MySQL.
Movendo para java.
-
Dentro da procedure faça um select para testar a chave antes de proceder a gravação.
É fácil.
-
Sim apenas de uma tabela. Vou criá-la em meu banco de teste e testá-la.
(Resolvido) Select dentro de select com inner join
em MySQL
Postado
Desculpe. Esqueci de nomear o campo.
Tente agora.