Ir para conteúdo

Arquivado

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

SamBuilder

Escolha aleatório de registros

Recommended Posts

Olá Pessoal,


Gostaria de receber dicas e saber um pouco sobre as experiências de quem já passou por isso.


Vou tentar ser o mais transparente possível:


Estou trabalhando em um sistema que precisa fazer uma escolha aleatória de uma lista com mais de 1.000 (hum mil) registros.


Tipo: Quando um usuário se loga ao sistema, dos 1.000 registros o sistema escolhe 1 (um) e deve fixar esse registro pra esse usuário logado. Este registro não pode mais mudar mesmo o usuário se logando novamente. Deve permanecer fixo e inalterável pra esse usuário.


Minha dificuldade estar sendo os acessos via mobile (celulares e Smartphone). Não descobri ainda o que estar acontecendo, pois, quando as pessoas se logam o sistema escolhe um registro, porém, quando a pessoa sai do sistema e se loga novamente o registro estar mudando onde deveria permanecer fixo.


Os acessos via desktop não acontece isso.


Gostaria de receber dicas e/ou sugestões. O que você sugeria? O sistema deve fixar esse registro no momento do login?? Ou após o login na abertura do painel administrativo?? Qual o melhor momento para se definir essa fixação?? Alguém já passou por isso na versão mobile??


Um forte abraço.


Compartilhar este post


Link para o post
Compartilhar em outros sites

Grave o registro numa tabela com id do user , data e numero do registro no primeiro acesso ,

No primeiro acesso do dia veja se o registro existe , se existe use este senão crie um novo

Rode um EVENT todo dia as 0h para excluir os registros do dia anterior.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Grave o registro numa tabela com id do user , data e numero do registro no primeiro acesso ,

No primeiro acesso do dia veja se o registro existe , se existe use este senão crie um novo

Rode um EVENT todo dia as 0h para excluir os registros do dia anterior.

Então amigo, basicamente o sistema faz isso. Só que até gravar o registro o sistema precisa fazer uma série de querys até ter certeza que que fato o registro estar disponível.

O que ocorre é que o acesso por celulares, às vezes, é bem lento e antes do sistema concluir essa série de querys o registro acaba sendo utilizado por uma pesquisa mais rápida de, talvez, um computador. Eu preciso executar algo que evite esse atrito entre o mobile e o desktop. Não sei se consegui ser claro na explicação.

Compartilhar este post


Link para o post
Compartilhar em outros sites
... o acesso por celulares, às vezes, é bem lento ... Não sei se consegui ser claro na explicação. ...

Creio que sim

O limite de 1.000 (hum mil) registros tem algum motivo ?

Não seria possível vincular apenas o registro ao usuário , um indicador do tipo ativo/inativo ?

A escolha no lugar de aleatória não poderia ser sequencial (1,2,3,4,5....1000,1,2 ...) ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que sim

O limite de 1.000 (hum mil) registros tem algum motivo ?

Não seria possível vincular apenas o registro ao usuário , um indicador do tipo ativo/inativo ?

A escolha no lugar de aleatória não poderia ser sequencial (1,2,3,4,5....1000,1,2 ...) ?

Eu citei 1.000 apenas como uma base, mais chega a ser bem mais que isso. A escolha é aleatória pois nem todos os registros obedecem aos critérios.

Até tem como vincular; o problema é que até chegar a esse vínculo é preciso passar por um sequencia de querys. E quando alguém acessa pelo celular, o sistema abre o processo e antes de fechar esse processo algum acesso mais rápido acaba, digamos, tomando aquele registro em análise dentro do processo.

Meu problema realmente estar sendo os acessos por celulares. E mais de 80% das pessoas no sistema acessam pelo celular.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não consigo ver motivos para colisão, o limite é físico ?

Qual a razão de vincular um usuário à um registro aleatório ?

O usuario se loga no Sistema , o registro da tabela muda um campo status de inativo para ativo ,

O usuario se desloga no Sistema , o registro da tabela muda um campo status de ativo para inativo ,

Regras que permitam ou não o acesso ao sistema como adimplência , vigência poderiam ater rodar previamente e deixar a posição atualizada.

A sequencia de sql´s poderia em tese estar em procedure do BD , em tese a App bastaria fazer uma chamada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não consigo ver motivos para colisão, o limite é físico ?

Qual a razão de vincular um usuário à um registro aleatório ?

....

....

A sequencia de sql´s poderia em tese estar em procedure do BD , em tese a App bastaria fazer uma chamada

Entendo. As sequencias estão em procedures.

Meu problema são os acessos via celulares. Imagine 200 usuários se logando ao mesmo tempo através de celulares com conexões lentas e outros se logando por computadores. De alguma forma isso estar deixando o sistema confuso e gerando essas colisões de informações.

O que preciso resolver é a questão de que uma lentidão não interfira na fixação desses registros. Preciso definir melhor o momento exato do sistema fazer essa seleção e fixação.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em tese, se o processo roda todo no servidor, do início ao fim e sem pausas, a "lentidão" do mobile não deveria afetá-lo; se é o servidor quem executa o processo, ele não depende da conexão do usuário. Então a partir do momento que o servidor receber a requisição, mesmo que a conexão do usuário seja lenta, o processo vai rodar dependendo da velocidade do seu servidor - a não ser que no meio do processo ele pare para consultar alguma informação que está no dispositivo do usuário.



Em que momento você define que o registro está "em uso"? No fim? Talvez você possa adicionar um marcador no registro bem no início do processo para indicar que aquele registro está "reservado", e sempre que for iniciar um novo processo (ex: para outros usuários) você deixa os registros "reservados" e "em uso" de fora do "sorteio". E aí no fim do processo, ou você define o registro como "em uso" (se deu tudo certo) ou então remove o marcado "reservado" para que ele possa ser usado por outra pessoa...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em que momento você define que o registro está "em uso"? No fim? Talvez você possa adicionar um marcador no registro bem no início do processo para indicar que aquele registro está "reservado", e sempre que for iniciar um novo processo (ex: para outros usuários) você deixa os registros "reservados" e "em uso" de fora do "sorteio". E aí no fim do processo, ou você define o registro como "em uso" (se deu tudo certo) ou então remove o marcado "reservado" para que ele possa ser usado por outra pessoa...

Humm. Entendi sua sugestão. Muito válida. Estou refazendo o procedimento e estudando cada possibilidade.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por JoaoSilva75
      pessoal
       
      esses sites que tem na internet para registro de dominio internacional .com
      cobram um valor no primeiro mes e depois é bem mais caro
       
      o dominio que eu queria registrar o site diz que ta liberado e custa $19,99 no primeiro ano depois diz que custa $ 1499,00 
      não entendi
       
      Domain Purchase $1,499.00* Premium Domain *First Year Cost. Renews at $19.99/year Privacy + Protection 1 Year $8.99    
      não entendi essa oferta
       
      existe um site para registro de dominio .com semelhante ao registro.br ???
       
      uma vez registrei um dominio no ig e custou 11 reais, faz tempo e agora o ig não esta mais registrando
      vcs me indicam algum site para eu registrar um dominio .com ???
       
      Abraço a vcs
    • Por Elisame Araújo
      Seguinte,
      Eu tenho uma página de atualização de lista de faixas que estão agrupados por álbum, com os dados vindo através de parâmetros na url como o albumID e detalhes e são retornados dentro de um while.
      O que eu queria é que ele atualizasse todos os campos que fossem editados se eles fossem modificados, mas o que o ocorre é que apenas o último registro é atualizado.
       
      O script que traz as faixas:
       
      <tr> <form class="form-group" method="post" action="includes/funcoes/atualizar-faixas.php"> <?php while($sqlSelect = mysqli_fetch_assoc($result)) { ?> <td><input type="text" value="<?php echo $sqlSelect['trackNumero'] ?>" class="form-control" name="trackNumero"></td> <td><input type="text" value="<?php echo $sqlSelect['trackTitulo'] ?>" class="form-control" name="trackTitulo"></td> <td><input type="text" value="<?php echo $sqlSelect['trackTraducao'] ?>" class="form-control" name="trackTraducao"></td> <td><input type="text" value="<?php echo $sqlSelect['trackID'] ?>" class="form-control" name="trackID" readonly></td> <td><input type="text" value="<?php echo $sqlSelect['albumID'] ?>" class="form-control" name="albumID" readonly></td> </tr> <?php } ?> <tr><a href="albuns-lista.php"><button name="cancelar" id="cancelar" class="btn btn-danger mb-3 mr-1" type="button"> <i class="fa-solid fa-arrow-left"></i> Voltar</button></a></tr> <tr><button name="update" id="update" class="btn btn-success mb-3" type="submit" value=""><i class="fa-solid fa-arrow-up-from-bracket"></i> Atualizar</button></tr> </form>  
       
      E esse é o resultado do código acima:

       
      E este é o código que uso pra fazer o UPDATE no banco de dados:
      <?php require_once "../db/albuns.php"; if(isset($_POST['update'])){ $trackNumero = $_POST['trackNumero']; $trackTitulo = mysqli_real_escape_string($conecta2, $_POST['trackTitulo']); $trackTraducao = $_POST['trackTraducao']; $trackID = $_POST['trackID']; $albumID = $_POST['albumID']; $sqlUpdate = "UPDATE `faixas` SET `trackTitulo` = '$trackTitulo', `trackNumero` = '$trackNumero', `trackTraducao` = '$trackTraducao' WHERE `albumID` = $albumID AND `trackID` = $trackID"; if($atualizaDados = mysqli_query($conecta2, $sqlUpdate) == true){ var_dump($sqlUpdate); //header("location: ../../albuns.php?update=sucesso"); } else { //header("location: ../../albuns.php?update=erro"); } } ?> Como eu faria para que cada linha fosse atualizada individualmente? Já tentei diversos métodos, mas o resultado continua sendo a atualização apenas do último registro no banco, ignorando o restante das atualizações.
    • Por luiz0o
      Estou fazendo um projeto para faculdade, e tenho um formulário, esse formulário precisa enviar as respostas tanto para um banco de dados, mas também tem que enviar para uma API que envia para meu email, mas não sei como fazer essas duas coisas ao mesmo tempo
    • Por michelramos
      tenho a seguinte view local no mysql:
      select orcamentos.id, orcamentos.id_empresa, 'orcamento' as tipo, orcamentos.data_aprovacao, month(orcamentos.data_aprovacao) as mes, year(orcamentos.data_aprovacao) as ano, sum(itens_orcamentos.quantidade) as quantidade, sum(itens_orcamentos.preco_unidade) as preco_unidade, sum(itens_orcamentos.desconto) as desconto, sum(itens_orcamentos.preco_unidade_desconto) as preco_unidade_desconto, orcamentos.desconto_orcamento as desconto_orcamento, sum(itens_orcamentos.preco_total) as preco_total, (orcamentos.total_outros_itens+orcamentos.outras_despesas+(select sum(preco_total) from itens_orcamentos where id_orcamento = orcamentos.id)) as total_sem_desconto, ( (orcamentos.total_outros_itens+orcamentos.outras_despesas+(select sum(preco_total) from itens_orcamentos where id_orcamento = orcamentos.id)) - (((orcamentos.total_outros_itens+orcamentos.outras_despesas+(select sum(preco_total) from orcamentos where id_orcamento = orcamentos.id))*orcamentos.desconto_orcamento)/100) ) as total_com_desconto from orcamentos inner join itens_orcamentos on orcamentos.id = itens_orcamentos.id_orcamento where orcamentos.id_situacao in (3,5,6) group by orcamentos.id union all select ordens_servico.id, ordens_servico.id_empresa, 'ordem_servico'as tipo, ordens_servico.data_aprovacao, month(ordens_servico.data_aprovacao) as mes, year(ordens_servico.data_aprovacao) as ano, sum(itens_ordem_servico.quantidade) as quantidade, sum(itens_ordem_servico.preco_unidade) as preco_unidade, sum(itens_ordem_servico.desconto) as desconto, sum(itens_ordem_servico.preco_unidade_desconto) as preco_unidade_desconto, ordens_servico.desconto as desconto_ordem_servico, sum(itens_ordem_servico.preco_total) as preco_total, ((select sum(preco_total) from itens_ordem_servico where id_ordem_servico = ordens_servico.id and tipo = 'produto')) as total_sem_desconto, ( (select sum(preco_total) from itens_ordem_servico where id_ordem_servico = ordens_servico.id and tipo = 'produto') - (((select sum(preco_total) from itens_ordem_servico where id_ordem_servico = ordens_servico.id and tipo = 'produto')*ordens_servico.desconto)/100) ) as total_com_desconto from ordens_servico inner join itens_ordem_servico on ordens_servico.id = itens_ordem_servico.id_ordem_servico where itens_ordem_servico.tipo = 'produto' and ordens_servico.id_situacao in(3,5,6) group by ordens_servico.id union all /* select nfe.id, nfe.id_empresa, 'nfe'as tipo, nfe.data_emissao, month(nfe.data_emissao) as mes, year(nfe.data_emissao) as ano, itens_nfe.descricao as nome, itens_nfe.id_item, coalesce(itens_nfe.quantidade_tributavel) as quantidade, coalesce(itens_nfe.valor_unitario_tributavel, 0) as preco_unidade, null, coalesce(itens_nfe.valor_unitario_tributavel, 0) as preco_unidade_desconto, (valor_unitario_tributavel*quantidade_tributavel) as preco_total from nfe inner join itens_nfe on nfe.id = itens_nfe.id_nfe where itens_nfe.tipo_item = 'produto' and nfe.id_situacao = 3 and nfe.incluir_no_faturamento = 's' */ select nfe.id, nfe.id_empresa, 'nfe'as tipo, nfe.data_emissao, month(nfe.data_emissao) as mes, year(nfe.data_emissao) as ano, null, (nfe.valor_total-nfe.valor_frete) as preco_unidade, null, (nfe.valor_total-nfe.valor_frete) as preco_unidade_desconto, null, (nfe.valor_total-nfe.valor_frete) as preco_total, (nfe.valor_total-nfe.valor_frete) as total_sem_desconto, (nfe.valor_total-nfe.valor_frete) as total_com_desconto from nfe where nfe.id_situacao = 3 and nfe.incluir_no_faturamento = 's' group by nfe.id union all select nfse.id, nfse.id_empresa, 'nfse'as tipo, nfse.data_emissao, month(nfse.data_emissao) as mes, year(nfse.data_emissao) as ano, null as quantidade, (nfse.valor_servicos-nfse.valor_deducoes) as preco_unidade, null, (nfse.valor_servicos-nfse.valor_deducoes) as preco_unidade_desconto, (nfse.valor_servicos-nfse.valor_deducoes) as preco_total, null, (nfse.valor_servicos-nfse.valor_deducoes) as total_sem_desconto, (nfse.valor_servicos-nfse.valor_deducoes) as total_com_desconto from nfse where nfse.id_situacao = 3 and nfse.incluir_no_faturamento = 's' group by nfse.id  
      que, quando coloco no banco online fica da seguinte forma:
      SELECT `orcamentos`.`id` AS `id`, `orcamentos`.`id_empresa` AS `id_empresa`, 'orcamento' AS `tipo`, `orcamentos`.`data_aprovacao` AS `data_aprovacao`, MONTH ( `orcamentos`.`data_aprovacao` ) AS `mes`, YEAR ( `orcamentos`.`data_aprovacao` ) AS `ano`, sum( `itens_orcamentos`.`quantidade` ) AS `quantidade`, sum( `itens_orcamentos`.`preco_unidade` ) AS `preco_unidade`, sum( `itens_orcamentos`.`desconto` ) AS `desconto`, sum( `itens_orcamentos`.`preco_unidade_desconto` ) AS `preco_unidade_desconto`, `orcamentos`.`desconto_orcamento` AS `desconto_orcamento`, sum( `itens_orcamentos`.`preco_total` ) AS `preco_total`, `orcamentos`.`total_outros_itens` + `orcamentos`.`outras_despesas` + ( SELECT sum( `itens_orcamentos`.`preco_total` ) FROM `itens_orcamentos` WHERE `itens_orcamentos`.`id_orcamento` = `orcamentos`.`id` ) AS `total_sem_desconto`, `orcamentos`.`total_outros_itens` + `orcamentos`.`outras_despesas` + ( SELECT sum( `itens_orcamentos`.`preco_total` ) FROM `itens_orcamentos` WHERE `itens_orcamentos`.`id_orcamento` = `orcamentos`.`id` ) - ( `orcamentos`.`total_outros_itens` + `orcamentos`.`outras_despesas` + ( SELECT sum( `itens_orcamentos`.`preco_total` ) FROM `orcamentos` WHERE `itens_orcamentos`.`id_orcamento` = `orcamentos`.`id` ) ) * `orcamentos`.`desconto_orcamento` / 100 AS `total_com_desconto` FROM ( `orcamentos` JOIN `itens_orcamentos` ON ( `orcamentos`.`id` = `itens_orcamentos`.`id_orcamento` ) ) WHERE `orcamentos`.`id_situacao` IN ( 3, 5, 6 ) GROUP BY `orcamentos`.`id` UNION ALL SELECT `ordens_servico`.`id` AS `id`, `ordens_servico`.`id_empresa` AS `id_empresa`, 'ordem_servico' AS `tipo`, `ordens_servico`.`data_aprovacao` AS `data_aprovacao`, MONTH ( `ordens_servico`.`data_aprovacao` ) AS `mes`, YEAR ( `ordens_servico`.`data_aprovacao` ) AS `ano`, sum( `itens_ordem_servico`.`quantidade` ) AS `quantidade`, sum( `itens_ordem_servico`.`preco_unidade` ) AS `preco_unidade`, sum( `itens_ordem_servico`.`desconto` ) AS `desconto`, sum( `itens_ordem_servico`.`preco_unidade_desconto` ) AS `preco_unidade_desconto`, `ordens_servico`.`desconto` AS `desconto_ordem_servico`, sum( `itens_ordem_servico`.`preco_total` ) AS `preco_total`, ( SELECT sum( `itens_ordem_servico`.`preco_total` ) FROM `itens_ordem_servico` WHERE `itens_ordem_servico`.`id_ordem_servico` = `ordens_servico`.`id` AND `itens_ordem_servico`.`tipo` = 'produto' ) AS `total_sem_desconto`, ( SELECT sum( `itens_ordem_servico`.`preco_total` ) FROM `itens_ordem_servico` WHERE `itens_ordem_servico`.`id_ordem_servico` = `ordens_servico`.`id` AND `itens_ordem_servico`.`tipo` = 'produto' ) - ( SELECT sum( `itens_ordem_servico`.`preco_total` ) FROM `itens_ordem_servico` WHERE `itens_ordem_servico`.`id_ordem_servico` = `ordens_servico`.`id` AND `itens_ordem_servico`.`tipo` = 'produto' ) * `ordens_servico`.`desconto` / 100 AS `total_com_desconto` FROM ( `ordens_servico` JOIN `itens_ordem_servico` ON ( `ordens_servico`.`id` = `itens_ordem_servico`.`id_ordem_servico` ) ) WHERE `itens_ordem_servico`.`tipo` = 'produto' AND `ordens_servico`.`id_situacao` IN ( 3, 5, 6 ) GROUP BY `ordens_servico`.`id` UNION ALL SELECT `nfe`.`id` AS `id`, `nfe`.`id_empresa` AS `id_empresa`, 'nfe' AS `tipo`, `nfe`.`data_emissao` AS `data_emissao`, MONTH ( `nfe`.`data_emissao` ) AS `mes`, YEAR ( `nfe`.`data_emissao` ) AS `ano`, NULL AS `NULL`, `nfe`.`valor_total` - `nfe`.`valor_frete` AS `preco_unidade`, NULL AS `NULL`, `nfe`.`valor_total` - `nfe`.`valor_frete` AS `preco_unidade_desconto`, NULL AS `NULL`, `nfe`.`valor_total` - `nfe`.`valor_frete` AS `preco_total`, `nfe`.`valor_total` - `nfe`.`valor_frete` AS `total_sem_desconto`, `nfe`.`valor_total` - `nfe`.`valor_frete` AS `total_com_desconto` FROM `nfe` WHERE `nfe`.`id_situacao` = 3 AND `nfe`.`incluir_no_faturamento` = 's' GROUP BY `nfe`.`id` UNION ALL SELECT `nfse`.`id` AS `id`, `nfse`.`id_empresa` AS `id_empresa`, 'nfse' AS `tipo`, `nfse`.`data_emissao` AS `data_emissao`, MONTH ( `nfse`.`data_emissao` ) AS `mes`, YEAR ( `nfse`.`data_emissao` ) AS `ano`, NULL AS `quantidade`, `nfse`.`valor_servicos` - `nfse`.`valor_deducoes` AS `preco_unidade`, NULL AS `NULL`, `nfse`.`valor_servicos` - `nfse`.`valor_deducoes` AS `preco_unidade_desconto`, `nfse`.`valor_servicos` - `nfse`.`valor_deducoes` AS `preco_total`, NULL AS `NULL`, `nfse`.`valor_servicos` - `nfse`.`valor_deducoes` AS `total_sem_desconto`, `nfse`.`valor_servicos` - `nfse`.`valor_deducoes` AS `total_com_desconto` FROM `nfse` WHERE `nfse`.`id_situacao` = 3 AND `nfse`.`incluir_no_faturamento` = 's' GROUP BY `nfse`.`id`  
      Não sei se a diferença tem haver com o problema, que é o seguinte:
      - ao puxar um registro x no banco local, o resultado retornado é o seguinte: 
      - id | id_empresa | tipo | data_aprovacao | mes | ano | quantidade | preco_unidade | desconto | preco_unidade_descont | desconto_orcamento | preco_total | total_sem_desconto - 181 1 orcamento 2022-10-04 00:00:00 10 2022 67,00 319,05 0,00 319,05 5,00 1350,90 1350,90 1283,355000 - ao puxar o mesmo registro no banco online, o resultado retornado é: - 181 1 orcamento 2022-10-04 00:00:00 10 2022 67,00 319,05 0,00 319,05 5,00 1350,90 1350,90 1318,649994 a ultima coluna está apresentando uma discrepência de mais ou menos 35 e não consegui encontrar nada a respeito
       
      obs: ambos os bancos são idênticos, os dados são idênticos.
    • Por Carlos Antoliv
      Senhores, bom dia.
       
      tenho um campo status. Então, a ideia é mudar o status. Consigo alterar o status quando necessário. Daí, pensei em todas vez que alterar, salvar o id do usuário, data, hora, o último status alterado...
      consigo fazer isso com INSERT, depois do UPDATE.
       
      Nao uso trigger. Até tentei fazer, mas não saiu como eu queria.
       
      Então, para os maiores entendedores do assunto, a melhor prática seria a TRIGGER ou INSERT ? Melhor prática ou o que mais funciona na prática ?
       
      Alguém poderia dissertar sobre isso ?
      Vlw..abço
×

Informação importante

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