Ir para conteúdo

POWERED BY:

Arquivado

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

andsoave

consulta ao Mysql

Recommended Posts

olá, sou Andsoave, novo no forum, e estou com uma dúvida na consulta ao Mysql, preciso fazer uma comparação de valores entre duas tabelas.

Se alguém puder me dar uma orientação, veja:

É um sistema de bingo a moda antiga, apenas as cartelas serão online, o sorteio será na base do globo, por bolas chamadas.

Sistema:

- O usuário entra no site e após login, prepara sua cartela virtual escolhendo 18 dezenas  de 60(01 a 60).

- esta cartela fica salva numa tabela com os campos palpite_1/palpite_2 ...até palpite_18.

- 3 prêmios aqui. 18 acertos - primeiro, 17 acertos - segundo e 16 acertos -terceiro.

- Criei outra tabela para guardar os números chamados por ordem de chamada, com os campos bola_1, bola_2 .... até bola_60

- Até aqui td bem, td rodando corretamente, meu problema está na conferência.

Problema:

- A bola sorteada terá um valor entre 01 e 60, a cartela tem 18 palpites aleatórios escolhido pelo usuário.

- preciso resgatar as cartelas que possui o valor da respectiva bola e combinando com as demais posteriores.

Minha dificuldade:

_ Não estou sabendo montar a SQL.

Pergunta:

Como faço para percorrer os campos da tabela sendo que o valor da $bola_1 pode ser qualquer um entre 60 dz e estar em qualquer um dos 18 campos dessa tabela?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Publica o modelo de dados.

Creio um sql count group bg com having resolva.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Motta, obrigado pela atenção.

 

o script é em MVC, PDO.

A TB da cartela é Meganet com 18 palpites os campos são palpite_1 até palpite_18

outra TB p/ gravar as bolas sorteadas TB_sorteio os campos são bola1 até bola60

tudo via post para MYSQL.

VEJA:

 // vem da view meganetresultform / controllers meganetresultform_action() mostra Formulário de conferência do sorteio Área ADM
    public function meganetResultForm()
    {
        if (empty($_POST['bola1'])){
            $_SESSION["feedback_negative"][] = FEEDBACK_SORTEIO_ERROR;
            return false;
        }
        $bola1 = strip_tags($_POST['bola1']);
        $bola2 = strip_tags($_POST['bola2']);
        $bola3 = strip_tags($_POST['bola3']);
        $sorteioNum = 1;
        $datasorteio = "10/08/2018";
        
        $sql = "INSERT INTO sorteio (bola1, bola2, bola3, sorteioNum, datasorteio) 
        VALUES(:bola1, :bola2, :bola3, :sorteioNum, :datasorteio)";
        $query = $this->db->prepare($sql);
        $query->execute(array(':bola1' => $bola1, ':bola2' => $bola2,':bola3' => $bola3, ':sorteioNum' => $sorteioNum, ':datasorteio' => $datasorteio));
        $count =  $query->rowCount();
        if ($count != 1) {
            $_SESSION["feedback_negative"][] = FEEDBACK_INSERTAR_SORTEIO_ERROR;
            return false;        
        }
        
        // obtém os dados na TB sorteio, através da $sorteioNum
        $query = $this->db->prepare("SELECT id_sorteio, bola1, bola2, bola3, sorteioNum, datasorteio 
            FROM sorteio WHERE sorteioNum = :sorteioNum");
        $query->execute(array(':sorteioNum' => $sorteioNum));
        if ($query->rowCount() != 1) {
            $_SESSION["feedback_negative"][] = FEEDBACK_ID_SORTEIO_ERROR;
            return false;
        }               
        $result_row = $query->fetch();
        $id_sorteio = $result_row->id_sorteio;             
        $bola1 = $result_row->bola1;
        $bola2 = $result_row->bola2;
        $bola3 = $result_row->bola3;
        $sorteioNum = $result_row->sorteioNum;
        $datasorteio = $result_row->datasorteio;
        $linhaNum1 = 1;

 

// Agora viria a comparação dos dados ....

 

será que dá pra entender?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Publica seu modelo de dados (tabelas do banco)

 

mas ...

supondo uma simplificação

 

cartela 
-------
numero_sorteio
numero_cartela

 

cartela_bola
------------
numero_sorteio
numero_cartela
nomero_bola

 

sorteio
-------
numero_sorteio

 

sorteio_bola
-------------
numero_sorteio
nomero_bola
select c.numero_sorteio,c.numero_cartela,count(c.nomero_bola) acertos
from   cartela_bola c,sorteio_bola select
where  c.numero_sorteio = s.numero_sorteio
and    c.nomero_bola = s.nomero_bola
group by c.numero_sorteio,c.numero_cartela
having count(c.nomero_bola) >= 16

Uma fonte https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nessa tabela ficam os palpites dos usuário, seria a cartela

 

CREATE TABLE IF NOT EXISTS `meganet1` (
  `id_meganet1` int(11) NOT NULL AUTO_INCREMENT,
  `nro_da_sorte` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `nome` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_1` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_2` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_3` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_4` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_5` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_6` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_7` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_8` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_9` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_10` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_11` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_12` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_13` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_14` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_15` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_16` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_17` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `palpite_18` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `user_id` bigint(10) NOT NULL,
  `whats` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `id_indicador` bigint(20) NOT NULL,
  `concordo` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id_meganet1`),
  UNIQUE KEY `nro_da_sorte` (`nro_da_sorte`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT;

 

e nessa salvo as bolas sorteadas por ordem de chamada.(lembrando, o sorteio não é virtual)

 

CREATE TABLE IF NOT EXISTS `sorteio` (
  `id_sorteio` int(11) NOT NULL AUTO_INCREMENT,
  `bola1` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `bola2` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `bola3` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `bola4` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `bola5` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `bola6` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `bola7` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `bola8` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `bola9` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `bola10` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `bola11` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `bola12` int(10) COLLATE utf8_unicode_ci NOT NULL,
  até a bola 60
  `bola60` int(10) COLLATE utf8_unicode_ci NOT NULL,
  `sorteioNum` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
  `datasorteio` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id_sorteio`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=100 ;

 

******************************************************

Motta, pense como se fosse a tele sena do silvio santos, só que com cartelas virtuais mas sorteios ao vivo.

 

A idéia é buscar o valor da bola sorteada nas cartelas dos usuários apostadores, até que alguem acerte todos os números.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

obrigado por ambas as informações Motta.

estou lendo tanto sobre a SQL como a normalize.

mas não entendi ainda como encontrar esses valores e combinar com os demais até que uma combinação se complete.

mesmo assim agradeço sua atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o Modelo for normalizado como no post de 15/8/  ontem às 11:38

basta uma sql simples encontrando os valores iguias , não normalizado (uma coluna para cada bola) , não

 

Além do que normalizado permite que se trate qualqeur cartela .

 

Imagine que lançam uma "cartela rápida" com 30 bolas no lugar de 60 ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

não normalizado (uma coluna para cada bola) , não"

Não consegui entender o raciocínio acima,

******

se o usuário logado vai formar sua cartela com 18 dezenas(palpites) escolhidas por ele entre 01 e 60 através de um formulário

não devo guardar o valor de cada palpite em uma coluna?

Não entendi isso, pode me dar um exemplo de como ficaria sua TB ?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como está teu modelo é preciso comparar os 18 palpites com as 60 bolas , isto gera 1080 combinações, o sql teria de tratar isto , tendo uma tabela com os palpites/bolas em linhas só uma comparação , o produto cartesiano seria feito pelo banco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Captei vossa mensagem.

Realmente, teria apenas uma coluna para consultar.

um exemplo grosseiro:

tb_palpite

id_palpite ..... palpite ....user_id

      01                 10              5

      02                  15              5

Seria isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim.

O mais importante é entender a modelagem.

80% do Sistema é resolvido aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, seguindo o seu exemplo, minha Base ficou assim:

*****

CREATE TABLE IF NOT EXISTS `cartela` (
  `numero_cartela` int(11) NOT NULL AUTO_INCREMENT,
  `nro_da_sorte` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `nome` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `numero_whats` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
  `id_indicador` int(11) NOT NULL,
  `whats_indicador` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
  `id_base` int(11) NOT NULL,
  `nome_indicador` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
  `numero_sorteio` int(11) NOT NULL,
  PRIMARY KEY (`numero_cartela`),
  KEY `fk_cartela_sorteio1_idx` (`numero_sorteio`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

--
INSERT INTO `cartela` (`numero_cartela`, `nro_da_sorte`, `user_id`, `nome`, `numero_whats`, `id_indicador`, `whats_indicador`, `id_base`, `nome_indicador`, `numero_sorteio`) VALUES
(2, 123456, 7, 'andsoave', '41984009859', 7, '41984009859', 62, 'anderson', 1);

ALTER TABLE `cartela`
  ADD CONSTRAINT `fk_cartela_sorteio1` FOREIGN KEY (`numero_sorteio`) REFERENCES `sorteio` (`numero_sorteio`) ON DELETE NO ACTION ON UPDATE NO ACTION;

**************************

 

CREATE TABLE IF NOT EXISTS `cartela_bola` (
  `idcartela_bola` int(11) NOT NULL AUTO_INCREMENT,
  `numero_bola` int(11) DEFAULT NULL,
  `numero_cartela` int(11) NOT NULL,
  `numero_sorteio` int(11) NOT NULL,
  PRIMARY KEY (`idcartela_bola`),
  KEY `fk_cartela_bola_cartela_idx` (`numero_cartela`),
  KEY `fk_cartela_bola_sorteio1_idx` (`numero_sorteio`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ;

--
INSERT INTO `cartela_bola` (`idcartela_bola`, `numero_bola`, `numero_cartela`, `numero_sorteio`) VALUES
(2, 1, 2, 1),
(3, 2, 2, 1),
(4, 3, 2, 1);

--
ALTER TABLE `cartela_bola`
  ADD CONSTRAINT `fk_cartela_bola_cartela` FOREIGN KEY (`numero_cartela`) REFERENCES `cartela` (`numero_cartela`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_cartela_bola_sorteio1` FOREIGN KEY (`numero_sorteio`) REFERENCES `sorteio` (`numero_sorteio`) ON DELETE NO ACTION ON UPDATE NO ACTION;

**************************************************

 

CREATE TABLE IF NOT EXISTS `sorteio` (
  `numero_sorteio` int(11) NOT NULL AUTO_INCREMENT,
  `data` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `hora` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`numero_sorteio`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;

-

INSERT INTO `sorteio` (`numero_sorteio`, `data`, `hora`) VALUES
(1, '15/09/2018', '10:00');

***************************************

 

CREATE TABLE IF NOT EXISTS `sorteio_bola` (
  `idsorteio_bola` int(11) NOT NULL AUTO_INCREMENT,
  `nomero_bola` int(11) NOT NULL,
  `numero_sorteio` int(11) NOT NULL,
  PRIMARY KEY (`idsorteio_bola`),
  KEY `fk_sorteio_bola_sorteio1_idx` (`numero_sorteio`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7 ;

--
INSERT INTO `sorteio_bola` (`idsorteio_bola`, `nomero_bola`, `numero_sorteio`) VALUES
(4, 1, 1),
(5, 2, 1),
(6, 3, 1);

--
ALTER TABLE `sorteio_bola`
  ADD CONSTRAINT `fk_sorteio_bola_sorteio1` FOREIGN KEY (`numero_sorteio`) REFERENCES `sorteio` (`numero_sorteio`) ON DELETE NO ACTION ON UPDATE NO ACTION;

***************************************************

Deixei os INSERTS para servir como exemplo apenas.

-------------------------------------------------------------------------------------------

Diante desses dados, tenho que buscar as cartelas acertadoras, para salvar em outra tabela e como disse anteriormente,

não estou sabendo juntar a instrução PHP e SQL pra executar isso.

Precisava  um exemplo para seguir, é possível?

 

select c.numero_sorteio,c.numero_cartela,count(c.nomero_bola) acertos
from   cartela_bola c,sorteio_bola select
where  c.numero_sorteio = s.numero_sorteio
and    c.nomero_bola = s.nomero_bola
group by c.numero_sorteio,c.numero_cartela
having count(c.nomero_bola) >= 16

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por Rafael_Ferreira
      Não consigo carregar a imagem do captcha do meu formulário. Foi testado com o xampp e easyphp. Também não carregou a imagem de outros captcha. 
       
       
    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
×

Informação importante

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