Relatório técnico

Queries Principais

Imagem padrão
Ouvir conteúdo
Clique para ouvir o texto completo

1. Consulta da Fila do Pregão (catalogo.php)

 
SELECT lp.id as id_pregao, lp.idMoeda, lp.preco as lance_inicial, lp.fimPregao, lp.status, am.imgAnunFrente, am.imgAnunVerso, (SELECT COUNT(*) FROM lances l WHERE l.idMoeda = lp.idMoeda AND l.idAnuncio = lp.idAnuncio) as total_lances, (SELECT MAX(l2.valor_lance) FROM lances l2 WHERE l2.idMoeda = lp.idMoeda AND l2.idAnuncio = lp.idAnuncio) as maior_lance_atual FROM lista_pregao lp JOIN anuncios_moedas am ON am.idAnuncio = lp.idAnuncio WHERE lp.status = 'aberto' ORDER BY CASE WHEN lp.fimPregao IS NOT NULL THEN 0 ELSE 1 END, lp.id ASC;

Função:

  • Retorna a lista de moedas/cédulas em fila de pregão aberta.

  • Inclui imagens, lance inicial, status e estatísticas de lances.

Observações Técnicas:

  • Subqueries para COUNT e MAX podem ser substituídas por LEFT JOIN em tabelas agregadas para melhorar performance em grandes filas.

  • Ordenação coloca primeiro as peças em leilão ativo (fimPregao IS NOT NULL) e depois as aguardando.


2. Inserção de Lance (lance_antecipado.php)

 
INSERT INTO lances (idMoeda, idAnuncio, idUsuario, valor_lance, data_hora) VALUES (:idMoeda, :idAnuncio, :idUsuario, :valor_lance, NOW())

Função:

  • Registra um novo lance no pregão.

Regras importantes implementadas no PHP:

  • Aceita apenas lances maiores que o último.

  • Em caso de lance igual, apenas o primeiro é aceito (não há empate).

Sugestões:

  • Adicionar triggers ou constraints para reforçar a regra de lances maiores diretamente no banco.

  • Indexar (idMoeda, idAnuncio, valor_lance) para acelerar consultas de MAX(valor_lance).


3. Consulta de Lances da Peça

 
SELECT * FROM lances WHERE idMoeda = :idMoeda AND idAnuncio = :idAnuncio ORDER BY valor_lance DESC, data_hora ASC LIMIT 1;

Função:

  • Recupera o maior lance atual para exibição.

  • data_hora ASC garante que, em caso de empate de valores, o primeiro lance vence.

Observações:

  • Essencial para validar regras de empate do pregão.

  • Pode ser otimizada com índice em (idMoeda, idAnuncio, valor_lance, data_hora).


4. Consulta para Catálogo de Moedas / Cédulas

 
SELECT * FROM anuncios_moedas WHERE idAnuncio IN (SELECT idAnuncio FROM lista_pregao WHERE status='aberto')

Função:

  • Retorna informações detalhadas das peças que estão na fila de pregão, usadas no catálogo e ficha técnica.

Sugestões:

  • Usar JOIN ao invés de IN para performance em grandes volumes.

  • Padronizar campos exibidos (nome, pais, ano, descricao) para facilitar front-end.


5. Contagem de Peças na Fila

 
SELECT COUNT(*) AS total_fila FROM lista_pregao WHERE status = 'aberto';

Função:

  • Fornece quantidade total de peças na fila para exibição no cabeçalho do catálogo.

Sugestão:

  • Criar query preparada com cache periódico, evitando contagem repetida em cada refresh da página.


6. Atualização de Status de Pregão

 
UPDATE lista_pregao SET status = :novo_status, fimPregao = NOW() WHERE id = :id_pregao;

Função:

  • Marca pregão como encerrado e define hora de finalização.

Observações:

  • Essencial para sincronização com front-end (ex.: destaque da próxima moeda).

  • Recomenda-se criar função PHP centralizada para atualização, evitando inconsistências.


7. Recomendações Gerais para Queries

  1. Use Prepared Statements em todas as queries com parâmetros externos.

  2. Indices adequados: (idMoeda, idAnuncio, valor_lance, data_hora) para performance.

  3. Evitar subqueries em SELECT quando possível; substituir por JOIN + GROUP BY.

  4. Auditoria: registrar logs de lances e alterações de status para rastreabilidade.

  5. Paginação: sempre que listar grandes volumes, usar LIMIT OFFSET para reduzir carga.

Tire suas dúvidas

Cecília Romani
Cecília Romani

Especialista em Numismática

Tire suas dúvidas com Cecília Romani sobre este capítulo pelo WhatsApp.

Falar com Cecília

Comentários

Área de comentários em breve...